当前位置:网站首页>Stc8h8k Series Assembly and c51 Real combat - NIXIE TUBE displays ADC, Key Series port reply Key number and ADC value
Stc8h8k Series Assembly and c51 Real combat - NIXIE TUBE displays ADC, Key Series port reply Key number and ADC value
2022-07-02 05:53:00 【Personne.】
Le tube numérique montreADC、Affichage du port sérieADCTouches et valeurs
Un.、Titre
Le passage et le passage sont réalisésADC0Connecté16- Oui.ADCMesure de la variation du signal de tension analogique causée par le bouton,Avec un tube numérique sur la boîte d'essai2Code clé d'affichage de bits,Faible4Affichage des bitsADValeur.Utilisation du port série1Afficher les valeurs clés et les valeurs des résultats de conversion sur l'assistant de port série hôte, Le format d'affichage est: Valeurs clés:Correspondant àADCRésultats.Continuer à appuyer sur la touche Entrée pour changer de ligne,Afficher la valeur de la clé suivante dans le même format etADCRésultats.
2.、Code
mainFonctions
//Élevé2Code clé d'affichage de bits,Faible4Affichage des bitsADValeur
#include<stc8h.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit busy;
u8 key=0;
uchar cnt1ms=0;
uint ad_volume=0;
#define ADC_OFFSET 64
uchar KeyCode=0;
void CalculateAdcKey(uint adc);
uint Get_ADC12bitResult(uchar channel); //channel = 0~7
#define font_PORT P6 // Définir le port de sortie du Code de police
#define position_PORT P7 // Définir le port de sortie du Code de contrôle des bits
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
void gpio() //gpio Initialiser comme port quasi bidirectionnel , Au début, à part P30,P31 Les autres sont à haute résistance
{
P0M1 = 0x00; P0M0 = 0x00; //Réglage du port quasi bidirectionnel
P1M1 = 0x00; P1M0 = 0x00; //Réglage du port quasi bidirectionnel
P2M1 = 0x00; P2M0 = 0x00; //Réglage du port quasi bidirectionnel
P3M1 = 0x00; P3M0 = 0x00; //Réglage du port quasi bidirectionnel
P4M1 = 0x00; P4M0 = 0x00; //Réglage du port quasi bidirectionnel
P5M1 = 0x00; P5M0 = 0x00; //Réglage du port quasi bidirectionnel
P6M1 = 0x00; P6M0 = 0x00; //Réglage du port quasi bidirectionnel
P7M1 = 0x00; P7M0 = 0x00; //Réglage du port quasi bidirectionnel
}
/*---------------------------- Envoyer des octets ----------------------------*/
void SendData(uchar dat)
{
while (busy);
busy = 1;
SBUF = dat; // Stockage des données à envoyer SBUF
}
/*---------------------------- Envoyer une fonction de chaîne ----------------------------*/
void SendString(uchar *s)
{
while (*s !='\0') // La chaîne ne s'arrête pas tant qu'elle n'est pas lue
{
SendData(*s++); // Chaque octet envoyé s++
}
}
void Timer0Init(void) //[email protected]
{
AUXR |= 0x80; //Horloge de minuterie1TMode
TMOD &= 0xF0; //Réglage du mode minuteur
TL0 = 0x40; //Définir la valeur initiale du timing
TH0 = 0xA2; //Définir la valeur initiale du timing
TF0 = 0; //EffacerTF0Le logo
TR0 = 1; //Minuterie0Début du timing
}
/*――――――――――Fonction de retard――――――――――――*/
void Delay1ms() //@24.000MHz
{
unsigned char i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@24.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
do
{
while (--j);
} while (--i);
}
/*――――――――――Afficher les fonctions――――――――――――*/
void LED_display(void)
{
uchar i;
for(i=0;i<8;i++)
{
position_PORT =0xff; font_PORT =LED_SEG[Dis_buf[i]]; position_PORT = Scan_bit[7-i]; Delay500us();
}
}
/*――――――――――Initialisation du port série――――――――――――*/
void InitUART(void)
{
SCON = 0x50; //8Données binaires
P_SW1= P_SW1 & 0x3F;
AUXR |= 0x40; //Minuterie1TMode
AUXR &= 0xFE;
TMOD &= 0x0F;
TMOD |= 0x20; //8Mode de recharge automatique bit
TL1 = 0xDC; //
TH1 = 0xDC;
TR1 = 1; //Allumez le minuteur1
ES = 1; //Ouverture de l'interruption du port série
EA = 1;
}
/**********************************************/
void main(void)
{
uint j;
gpio();
ADCCFG=ADCCFG|0x20; //RESFMTEmplacement1, Enregistrer les résultats à droite
ADC_CONTR = 0x80; //Ouvre.AD Alimentation du module de conversion
P1M1=P1M1|0x01; //P1 Port réglé à haute résistance
Timer0Init();
InitUART();
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
EA = 1; //Ouvrir l'interruption totale
while(1)
{
Dis_buf[4] = ad_volume / 1000%10; //AfficheradValeur
Dis_buf[5] = ad_volume/100%10; //AfficheradValeur
Dis_buf[6] = ad_volume / 10%10; //AfficheradValeur
Dis_buf[7] = ad_volume % 10; //AfficheradValeur
Dis_buf[0] = KeyCode / 10; // Afficher les clés
Dis_buf[1] = KeyCode % 10; // Afficher les clés
LED_display();
if(cnt1ms >= 10) //10msLisez une foisADC
{
cnt1ms = 0;
j = Get_ADC12bitResult(0); //0Accès,Méthode de requête une foisADC, La valeur de retour est le résultat, == 4096 Erreur
if(((256-ADC_OFFSET)<j)&&(j < 4096))
{
LED_display(); //Secoue - toi.
LED_display();
j = Get_ADC12bitResult(0);
if(((256-ADC_OFFSET)<j)&&(j < 4096))
{
ad_volume=j;
CalculateAdcKey(j); // Touches de calcul
SendData(KeyCode/10+0x30);
SendData(KeyCode%10+0x30);
SendString(": ");
SendData(ad_volume / 1000%10+0x30);
SendData(ad_volume/100%10+0x30);
SendData(ad_volume / 10%10+0x30);
SendData(ad_volume % 10+0x30);
SendString("\r\n");
Dis_buf[4] = ad_volume / 1000%10; //AfficheradValeur
Dis_buf[5] = ad_volume/100%10; //AfficheradValeur
Dis_buf[6] = ad_volume / 10%10; //AfficheradValeur
Dis_buf[7] = ad_volume % 10; //AfficheradValeur
Dis_buf[0] = KeyCode / 10; // Afficher les clés
Dis_buf[1] = KeyCode % 10; // Afficher les clés
LED_display();
L1: j = Get_ADC12bitResult(0);
while(((256-ADC_OFFSET)<j)&&(j < 4096)) //Key Release
{
LED_display();
goto L1;
}
}
}
}
}
}
/****************MesureADValeur*************************/
uint Get_ADC12bitResult(uchar channel) //channel = 0~15
{
ADC_RES = 0; // Effacer le registre des résultats de conversion 0
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | 0x40 | channel; //D'abord l'électricité.,On recommence., Sélectionner à nouveau le canal
_nop_(); _nop_(); _nop_(); _nop_();// Attendez que le circuit se stabilise au début.
while((ADC_CONTR & 0x20) == 0) ; //Attendez.ADCTerminé.
ADC_CONTR &= ~0x20; //EffacerADCDrapeau de fin
return (((uint)ADC_RES << 8) | ADC_RESL );
}
/***************** ADC Clé de calcul du clavier ********************************/
void CalculateAdcKey(uint adc)
{
uchar i;
uint j=256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET))) break; // Déterminer si l'écart se situe dans la plage
j += 256;
}
if(i < 17) KeyCode = i; // Enregistrer la clé
}
/********************** Timer0 1msFonction d'interruption ************************/
void timer0 (void) interrupt 1
{
cnt1ms++;
}
/*---------------------------- UART Interruption -----------------------------*/
void Uart() interrupt 4 using 1
{
LED_display();
if (RI)
{
RI = 0; // Après avoir reçu les caractères ,RIChing0
}
if (TI)
{
TI = 0; // Après avoir envoyé les caractères TIChing0
busy = 0; // Après avoir envoyé un caractère busyChing0
}
}
LED_displayFonctions
// Ce qui suit:LED_display.c
#include <stc8h.h>
#include <intrins.h>
#define font_PORT P6 // Définir le port de sortie du Code de police
#define position_PORT P7 // Définir le port de sortie du Code de contrôle des bits
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
/*――――――――――Fonction de retard――――――――――――*/
void Delay1ms() //@24.000MHz
{
unsigned char i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
/*――――――――――Afficher les fonctions――――――――――――*/
void LED_display(void)
{
uchar i;
for(i=0;i<8;i++)
{
position_PORT =0xff; font_PORT =LED_SEG[Dis_buf[i]]; position_PORT = Scan_bit[7-i]; Delay1ms ();
}
}
LED_display.hFichier d 'en - tête
#ifndef __LED_DISPLAY_H__
#define __LED_DISPLAY_H__
void Delay1ms();
void LED_display(void);
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
#end if
Merci beaucoup de regarder. !!!
Série d'articles——STC8H8KCompilation des séries51Sur le terrain
STC8H8K Compilation de séries et C51Sur le terrain—— Réalisation de la lumière de course (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Feu de circulation à double interruption
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de fréquence simple
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de secondes (Compilation)
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de secondes (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Nombre de touches autorisé (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Nombre de touches autorisé (Compilation)
边栏推荐
- Simply encapsulate JS and apply it
- Zzuli:1068 binary number
- Generate QR code
- Gcnet: non - local Networks meet Squeeze excitation Networks and Beyond
- 1035 Password
- 【論文翻譯】GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond
- Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)
- RGB infinite cube (advanced version)
- 1037 Magic Coupon
- 深度学习分类网络--Network in Network
猜你喜欢
DRM display framework as I understand it
“简单”的无限魔方
idea开发工具常用的插件合集汇总
Practice C language advanced address book design
2022-2-14 learning xiangniuke project - Section 7 account setting
Summary of MySQL constraints
Spark概述
Reading notes of cgnf: conditional graph neural fields
CNN可视化技术 -- CAM & Grad-CAM详解及pytorch简洁实现
ESP8266与STC8H8K单片机联动——天气时钟
随机推荐
php父类(parent)
页面打印插件print.js
Some experience of exercise and fitness
【論文翻譯】GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond
Pytorch Basics
php数组转化为xml
【LeetCode】Day92-盛最多水的容器
Zzuli:1068 binary number
5g market trend in 2020
Conglin environmental protection rushes to the scientific and Technological Innovation Board: it plans to raise 2billion yuan, with an annual profit of more than 200million yuan
Test case
《CGNF: CONDITIONAL GRAPH NEURAL FIELDS》阅读笔记
TypeScript的泛型和泛型约束
Appnuim environment configuration and basic knowledge
2022-2-15 learning xiangniuke project - Section 8 check login status
File contains vulnerability (I)
Regular expression summary
Fundamentals of software testing
软件测试 - 概念篇
PHP array to XML