完全代碼
百度文庫搜集 控制端子已經匹配普中6800開發板
每隔一分鐘,蜂鳴器響一次,按鍵按一下,計數器清0
#include<reg51.h>
#include<intrins.h> //intrins.h,函數,應用于程序設計,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用。
//crol_ 字符循環左移
//_cror_ 字符循環右移
//_irol_ 整數循環左移
//_iror_ 整數循環右移
//_lrol_ 長整數循環左移
//_lror_ 長整數循環右移
//_nop_ 空操作 (相當于8051 NOP 指令)
//_testbit_ 測試并清零位 (相當于8051 JBC 指令)
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //1-9
uchar code p[]="-";//code
uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;
void delay_ms(int x)//延時程序,延時1ms
{
uint i;
while(x--)
for(i=0;i<120;i++);
}
uchar busy()//對LCD1602 判斷是否忙
{
uchar status; //聲明函數status
RS=0; //讀內部寄存器狀態算是讀指令選擇 RS=0指令選擇
RW=1; //讀操作
EN=1;//使能信號也就是開始工作的意思 ,讀操作一直高電平,寫操作只是高脈沖
delay_ms(1);
status=P0; //函數定義為P0,就是說p0是數據口 00-07 8個端子要是07是高電位就是1602忙碌 07是低電平就是閑
EN=0; //讀操作完成 拉低使能信號,為下次工作做準備
return status; //return 返回函數 讀取完P0口數據返回主函數
}
void write_cmd(uchar cmd)//寫命令程序,首先對其進行判忙
{
while((busy()&0x80)==0x80);//對返回進行或運算判斷全1則1,如果為忙就進行等待
RS=0; //命令選擇
RW=0; //寫操作
EN=0;// 片選信號拉低準備工作
P0=cmd; //函數cmd的數據放到P0上
EN=1; //片選信號開始工作
delay_ms(1);
EN=0;//拉低片選為下次做準備
}
void write_data(uchar dat) //寫數據函數函數dat
{
while((busy()&0x80)==0x80); //忙判斷 或-全1則1
RS=1; //數據選擇
RW=0; //寫操作
EN=0; //片選信號
P0=dat; //P0讀取dat
EN=1; //開始傳送
delay_ms(1);
EN=0; //拉低片選信號
}
void canshu() //初始化函數
{
write_cmd(0x38);
delay_ms(1);
write_cmd(0x01);
delay_ms(1);
write_cmd(0x06);
delay_ms(1);
write_cmd(0x0c);
delay_ms(1);
}
*****************************************************************************
********************************************************************************
/*void xianshi(uchar x,uchar y,uchar *str) //*str是指針字符串的指針,xy可能是數據指針函數
{
uint i=0; //聲明函數i并且賦值0
if(y==0) //當函數y=0時 為真 可能是寫在第一行的意思
write_cmd(0x80|x); //執行命令x和0x80(1000 0000)相與 全1是1得出命令 執行
if(y==1) //當函數y=1時 為真 可能是寫在第二行的意思
write_cmd(0xc0|x); //執行命令x和0xc0(1100 0000|x)相與 全1是1得出命令 執行 0xc0=0x80+0x40
for(i=0;i<16;i++) //i值循環增加
{
write_data(str[i]); //*str是指針字符串的指針,
//str[i]的意思可能是把i變成字符串 當數據執行
if(p=='\0') //字符串判斷結束標志 如果p的ascii碼為0 好像是把一個字符串賦值給數組:u8 str1[]={"cxjr.21ic.org"};
//實際上數組str1在內存中的實際存放情況為:
// c x j r . 2 1 i c . o r g '\0'
//這后面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。
break;
}
} */
void aaa() interrupt 1 //定時器aaa函數中斷入口1
{
TH0=(65535-50000)/256; //50ms一中斷
TL0=(65535-50000)%256;
if(++kk==40) //k先+在判斷是否=18 kk可能是中斷函數 先++在計算是為了從0開始計數 后++可能從1 開始
{
miao++; //kk中斷18次時間秒自加1
if(miao==10) //當個位=10
{
if(miao1++==5) //miao1 自加一次 直到5次以后秒數達到59 后條件導通程序往下一步走
{
if(fen++==10)
{
if(fen1++==5)
{
if(shi++==10)
{
if(shi1++==1)
{
shi1=0;
shi=0;
}
shi=0;
}
fen1=0;
}
fen=0;
}
miao1=0;
}
miao=0;
}
kk=0;
}
}
void main()
{
P1=0x00;
P2=0X06;
canshu();
//xianshi(0,0,p);
//xianshi(0,1,p+16);
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65535-50000)/256;//如果不準可對其進行修改,比如4000可能更準確 TL0=(65535-50000)%256;
TL0=(65535-50000)%256; TR0=1;
while(1)
{
write_cmd(0x80|1); //1000 0001 相與有1則一 這個是時的位置
write_data(dis2[shi]); //dis2[]1-9數組名字 這個是時的顯示
write_cmd(0x80|2);//10000010 也就是十六進制0x82代表時的個位顯示位置
write_data(dis2[shi1]);//1-9數組選擇小時的個位
write_cmd(0x80|3);//地址0x83 在這個地址上寫
write_data(p[0]);//數據為第二個數組的0位 這個數組就一個-符號
write_cmd(0x80|4); //地址0x84 也就是分的十位
write_data(dis2[fen1]); //寫數據函數 寫數組制定數據到分的十位
write_cmd(0x80|5);
write_data(dis2[fen]);
write_cmd(0x80|6);
write_data(p[0]);
write_cmd(0x80|7);
write_data(dis2[miao1]);
write_cmd(0x80|8);
write_data(dis2[miao]);
}
}
|