📄 key_uart.c
字号:
/*****************************************************
激情创造,精彩无限-------欢迎进入单片机的世界
*****************************************************/
/*****************************************************
程序说明:本程序完成在实验箱BANK 3部分显示接收到的PC发送给单片机
的字符的ASCII码值,及接收到的数据的个数;同时当按下行列
式键盘中的键时,将该键的键值发送给PC机,并在数码管上显
示发送的次数。
硬件连接:使用实验箱BANK 3部分电路。
程序版本:
作者:ZJ
编写时间:2007年12月13日
修改记录:
备注:
*****************************************************/
#include <reg52.h>
sbit SEGLOCK = P1^3; //定义段码锁存信号端名字
sbit POSITLOCK = P1^2; //定义位选锁存信号端名字
code unsigned char LedCode[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳数码管码表
code unsigned char PositCode[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//共阳数码管位选信号码表
code unsigned char ASCII[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//数字0----F对应的ASCII码值
unsigned char Rch,Tch; //定义接收和发送字符变量
unsigned char Rcounter,Tcounter; //定义接收和发送字符次数变量
unsigned char DisBuf[8]; //定义显存空间
/**********************************************
函数名称:段码锁存信号函数
函数功能:实现段码锁存功能
入口参数:void
出口参数:void
备注:
**********************************************/
void SegLock (void)
{
SEGLOCK = 1;
SEGLOCK = 0;
}
/**********************************************
函数名称:位选锁存信号函数
函数功能:实现位选锁存功能
入口参数:void
出口参数:void
备注:
**********************************************/
void PositLock (void)
{
POSITLOCK = 1;
POSITLOCK = 0;
}
/**********************************************
函数名称:Delay()
函数功能:实现一短暂的延时,时间长短由入口参数决定
入口参数:unsigned int
出口参数:void
备注:
**********************************************/
void Delay (unsigned int Dat)
{
unsigned int i;
for (i=0;i<Dat;i++);
}
/**********************************************
函数名称:数码管显示函数
函数功能:实现8位数码管的显示
入口参数:void
出口参数:void
备注:
**********************************************/
void Display (void)
{
unsigned char i;
for (i=0;i<8;i++)
{
P0 = LedCode[DisBuf[i]]; //送对应的显存空间中数的段码
SegLock(); //锁存段码
P0 = PositCode[i]; //送对应的显存的位选信号
PositLock(); //锁存位选
Delay(10); //延时
P0 = 0x00; //送消隐信号
PositLock();
}
}
/**********************************************
函数名称:显存数据更新函数
函数功能:实现8位显存数据的更新
入口参数:void
出口参数:void
备注:
**********************************************/
void DisPrint (void)
{
DisBuf[0] = Tch >> 4; //将发送数据的ASCII码值的高四位送入DisBuf[0]
DisBuf[1] = Tch & 0x0f; //将发送数据的ASCII码值的低四位送入DisBuf[1]
DisBuf[2] = Tcounter / 10; //将发送数据次数变量的十位送入DisBuf[2]
DisBuf[3] = Tcounter % 10; //将发送数据次数变量的个位送入DisBuf[3]
DisBuf[4] = Rch >> 4; //将接收数据的ASCII码值的高四位送入DisBuf[4]
DisBuf[5] = Rch & 0x0f; //将接收数据的ASCII码值的低四位送入DisBuf[5]
DisBuf[6] = Rcounter / 10; //将接收数据次数变量的十位送入DisBuf[6]
DisBuf[7] = Rcounter % 10; //将接收数据次数变量的个位送入DisBuf[7]
}
/**********************************************
函数名称:判键函数
函数功能:判断是否有键按下
入口参数:void
出口参数:unsigned char ( 0 / 1)
备注:
**********************************************/
unsigned char Kbhit (void)
{
P2 = 0xf0;
if ( P2==0xf0 ) return (0);
else return (1);
}
/**********************************************
函数名称:判键值函数
函数功能:判断按键的键值
入口参数:void
出口参数:unsigned char
备注:
**********************************************/
unsigned char GetKeyCode ( void )
{
unsigned char keycode; //定义一个键值变量用于判断键值
P2 = 0x0f;
keycode = P2;
P2 = 0xf0;
keycode |= P2; //将组合以后的键值存储
switch ( keycode )
{
case 0xee: return ( 15 ); break;
case 0xde: return ( 0 ); break;
case 0xbe: return ( 14 ); break;
case 0x7e: return ( 13 ); break;
case 0xed: return ( 7 ); break;
case 0xdd: return ( 8 ); break;
case 0xbd: return ( 9 ); break;
case 0x7d: return ( 12 ); break;
case 0xeb: return ( 4 ); break;
case 0xdb: return ( 5 ); break;
case 0xbb: return ( 6 ); break;
case 0x7b: return ( 11 ); break;
case 0xe7: return ( 1 ); break;
case 0xd7: return ( 2 ); break;
case 0xb7: return ( 3 ); break;
case 0x77: return ( 10 ); break;
}
}
/**********************************************
函数名称:主函数
函数功能:
入口参数:void
出口参数:void
备注:
**********************************************/
void main (void)
{
SCON = 0x50; //设定串口工作方式
TMOD = ( TMOD&0x0F ) | 0x20; //设定T1波特率发生器工作方式
TH1 = -11059200/12/32/9600; //设定T1的初值
TL1 = TH1;
TR1 = 1; //启动波特率发生器
ES = 1; //开启串口中断
EA = 1; //开启单片机总的中断
while (1)
{
DisPrint(); //更新显存内容
Display(); //调用显示函数
if ( Kbhit() ) //判断有无键按下
{
SBUF = ASCII[GetKeyCode()]; //将按下的键的键值取出转换成ASCII码值后送如发送缓冲器发出
TI = 0;
while ( TI==0 ); //判断发送是否完成
TI = 0; //发送完成后把TI清零,防止TI触发中断
if(++Tcounter >= 100) //对发送数据次数变量加1,判断是否超过100
Tcounter = 0;
Tch = ASCII[GetKeyCode()]; //更新发送数据变量的值
while ( Kbhit() ) //判断键是否弹起,如果没有,循环执行更新显存和显示函数
{
DisPrint();
Display();
}
}
}
}
/**********************************************
函数名称:串口中断服务程序函数
函数功能:判断是否接收到数据
入口参数:void
出口参数:void
备注:
**********************************************/
void Uart_int (void) interrupt 4
{
if (RI) //判断是否接收到了新的数据
{
Rch = SBUF; //如果接收到了新的数据,将新的数据取出
RI = 0;
if (++Rcounter >= 100) //对接收数据次数变量加1,判断是否超过100
Rcounter = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -