当前位置:首页 > LCD显示的秒表单片机课程设计
芜湖职业技术学院 信息工程系
1602LCD秒表的显示源代码:
//------------------------------------Main.c----------------------------------------- //名称:用1602LCD设计秒表
//-----------------------------------------------------------------------------------
//说明:首次按下K1键时开始计时,再次按下时暂停,第三次按下时继续 // 累计计时,再次按下时停止计时,K2键用于清零秒表 //----------------------------------------------------------------------------------- # include
#define uchar unsigned char #define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
//LCD控制函数
void LCD_Initialize();
void LCD_Set_POS(uchar); void LCD_Write_Data(uchar);
void Display_String(uchar *,uchar);
sbit K1=P1^0; sbit K2=P2^1; sbit BEEP=P3^0; sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_EN=P2^2; uchar KeyCount=0;
uchar code msg1[]={%uchar code msg2[]={\ %uchar code Prompts[][16]= {
{\ \ {\ \ {\ \ {\}
//计时缓冲与显示缓冲
uchar Time_Buffer[] ={0,0,0,0};
uchar LCD_Display_Buffer[] ={\
//------------------------------------------------------------------------------------- //蜂鸣器
//------------------------------------------------------------------------------------- void BeeP()
37
芜湖职业技术学院 信息工程系
{
uchar i,j=70;
for (i=0;i<180;i++) {
while (--j); BEEP=~BEEP; }
BEEP=0; }
//------------------------------------------------------------------------------------- //延时
//------------------------------------------------------------------------------------- void DelayX(uint ms) {
uchar i;
while(ms--) for (i=0;i<120;i++); }
//------------------------------------------------------------------------------------- //显示计时
//------------------------------------------------------------------------------------- void Show_Second() {
uchar i;
LCD_Set_POS(0X45); //设置LCD显示起点 for (i=3;i!=0xff;i--) {
//将两位整数的1、100s,秒,分,时转换为8位数字字符 LCD_Display_Buffer[2*i+1]=Time_Buffer[i]/10+'0'; LCD_Display_Buffer[2*i]=Time_Buffer[i]+'0'; //在i=3,2,1,0时分别显示时,分,秒,1/100s LCD_Write_Data(LCD_Display_Buffer[2*i+1]); LCD_Write_Data(LCD_Display_Buffer[2*i]); LCD_Write_Data(':'); } }
//------------------------------------------------------------------------------------ //Time0中断
//------------------------------------------------------------------------------------ void Time0() interrupt 1 using 0 {
TH0=-10000/256; TL0=-10000%6;
38
芜湖职业技术学院 信息工程系
Time_Buffer[0]++;
if(Time_Buffer[0]==100) {
Time_Buffer[0]=0; Time_Buffer[1]++; }
if(Time_Buffer[1]==60) //秒 {
Time_Buffer[1]=0; Time_Buffer[2]++; }
if(Time_Buffer[2]==60) //分 {
Time_Buffer[2]=0; Time_Buffer[3]++; }
if(Time_Buffer[3]==24) //时 Time_Buffer[3]=0; }
//------------------------------------------------------------------------------------ //主函数
//------------------------------------------------------------------------------------ void main() {
uchar i; IE=0x82;
TMOD=0X01; TH0=-10000/256; TL0=-10000%6; LCD_Initialize();
Display_String(msg1,0x00); Display_String(msg2,0x40); While (1) {
if (K1==0) {
DelayX(100); i=++KeyCount; switch(i) {
Case 1:
Case 3: TR0=1;
Display_String(Promts[i-1],0); break; Case 2:
Case 4: TR0=0;
Display_String(Promts[i-1],0);
39
芜湖职业技术学院 信息工程系
break; default:TR0=0; break; }
while (K1==0); // Beep(); } else
if (K2==0) {
TR0=0;
KeyCount=0; for(i=0;i<4;i++) Time_Buffer[i]=0;
Display_String(msg1,0); Beep();
DelayX(100); While (K2==0); // }
Show_Second(); } }
//-------------------------------------160LCD.C------------------------------------- //1602LCD显示驱动函数
//---------------------------------------------------------------------------------- # include
# define uchar unsigned char # define uint unsigned int
# define DelayNOP() {_nop();_nop();_nop();_nop();} sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_EN=P2^2; bit LCD_Busy_Check(); void LCD_Busy_Check(); void LCD_Initialize();
void LCD_Write_Command(uchar); void LCD_ Write_Data(uchar);
//------------------------------------------------------------------------------ //延时
//------------------------------------------------------------------------------ void DelayMS(uint ms) {
40
共分享92篇相关文档