久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
12864時鐘(定時器)+18b20+按鍵調時單片機程序
[打印本頁]
作者:
1367067553
時間:
2019-5-6 13:35
標題:
12864時鐘(定時器)+18b20+按鍵調時單片機程序
本帖最后由 1367067553 于 2019-5-11 15:34 編輯
#include <reg51.h> //頭文件
#include <intrins.h>
#define uint unsigned int //宏定義
#define uchar unsigned char
/*TS12864A-3 端口定義*/
#define LCD_data P0 //數據口
sbit LCD_RS = P3^5; //寄存器選擇輸入
sbit LCD_RW = P3^6; //液晶讀/寫控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^7; //串/并方式控制
/*鍵盤定義*/
sbit LIE1 = P2^4; //定義列
sbit LIE2 = P2^5;
sbit LIE3 = P2^6;
sbit LIE4 = P2^7;
sbit HANG1 = P2^0; //定義行
sbit HANG2 = P2^1;
sbit HANG3 = P2^2;
sbit HANG4 = P2^3;
sbit D1 = P1^3;
sbit DQ = P1^1; //定義DS18B20口
sbit beep =P1^2; //蜂鳴器
/*變量定義*/
uchar ucKeyNumber; //記錄按鍵值
uchar ucMatrixStatus; //矩陣鍵盤狀態
uint uiMatrixCount; //矩陣鍵盤計數
uint uiMatrixLieSelect; //矩陣鍵盤計數
uchar ucMatrixTemp; //按鍵端口
uchar ucStatus,flag=0,king; //定義標志位
uint uiCount,uiStatus;
uchar miao=48,fen=59,shi=23,nian=19,yue=5;ri=2;
uchar mun_char_table[]={"0123456789"};
/*函數調用*/
void My_T0(void); //定時器初始化
void delay(int ms); //LCD12864延時函數
void lcd_wcmd(uchar cmd); //寫命令
void lcd_wdat(uchar dat); //寫指令
void lcd_init(); //LCD12864初始化
void LCDWrituenumber(uchar x,uchar y,uchar ucDAT); //寫字符
void lcd_pos(uchar X,uchar Y); //寫字符串
void xianshi(void); //顯示
void kaiji(void); //開機動畫
void Matrix_keyboar(void); //按鍵掃描
void keyRun(void); //按鍵執行
/*********ds18b20模塊*************/
void delay_us(uint i)
{
while(i--);
}
//********DS18B20初始化************//
void DS18B20_Init(void)
{
uchar x;
DQ = 1;
delay_us(100);
DQ = 0;
delay_us(1000);
DQ = 1;
delay_us(200);
x = DQ; //DQ管腳送出60-240us的0脈沖 以示初始化成功
delay_us(250);
}
//************寫一個字節************//
void write_OneChar(uchar dat)
{
uchar i=0;
for(i = 8;i > 0;i--)
{
DQ = 0;
DQ = dat&0x01;
delay_us(60);
DQ = 1;
dat>>=1;
}
}
//************讀一個字節***********//
uchar Read_OneChar(void)
{
uchar i=0;
uchar value = 0;
for(i = 8;i > 0;i--)
{
DQ = 0;
value>>=1;
DQ = 1;
if(DQ)value|=0x80;
delay_us(50);
}
return(value);
}
//**************讀取溫度**************//
uint ReadTemperature(void)
{
uchar a = 0;
uchar b = 0;
uint t = 0;
float tt = 0;
DS18B20_Init();
write_OneChar(0xcc);
write_OneChar(0x44);
DS18B20_Init();
write_OneChar(0xcc);
write_OneChar(0xbe);
a = Read_OneChar();
b = Read_OneChar();
t = b;
t <<= 8;
t = t|a;
tt = t*0.0625;
t = tt*10+0.5;
return(t);
}
/**************************************************
*函數類型:main.c
*函數名稱:主函數
**************************************************/
void main(void)
{
lcd_init(); //12864初始化
DS18B20_Init(); //18B20初始化
while(1)
{
My_T0();
kaiji();
xianshi();
}
}
/**************************************************
* LCD12864模塊
/**************************************************/
void delay(int ms) //LCD12864延時函數
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/*寫指令數據到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delay(1);
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
/*******************************************************************/
/*寫顯示數據到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay(1);
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
/*******************************************************************/
/* LCD初始化設定 */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //顯示開,關光標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
/*********************************************************
* 寫字符 *
**********************************************************/
void LCDWritueString(uchar x,uchar y,uchar *str) //固定格式
{
uchar i;
lcd_pos(x,y);
i = 0;
while(str[i] != '\0')
{
lcd_wdat(str[i]); //顯示字符
i++;
}
}
/*********************************************************
* 寫字符串 *
*********************************************************/
void LCDWrituenumber(uchar x,uchar y,uchar ucDAT)
{
lcd_pos(x,y);
lcd_wdat((ucDAT / 10)+ 48);
lcd_wdat((ucDAT % 10) + 48);
}
/*************************************************
* 設定顯示位置 *
*************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //顯示地址
}
/**********************************************
* 定時器初始化 *
**********************************************/
void My_T0(void)
{
TMOD = 0x01;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/***********************************************
* 定時器T0服務函數 *
***********************************************/
void Tim0() interrupt 1
{
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
Matrix_keyboar();
keyRun();
uiStatus++;
if(king == 0)
{
uiCount++;
}
if(uiCount >= 1000)
{
uiCount = 0;
miao++;
if(miao >=60)
{
miao = 0;
fen++;
}
if(fen >= 60)
{
fen = 0;
shi++;
}
if(shi >= 24)
{
shi = 0;
ri++;
}
if(ri >=31)
{
ri = 0;
yue++;
}
if(yue >= 12)
{
yue = 0;
nian++;
}
}
}
/***********************************************
* 顯示函數 *
***********************************************/
void xianshi(void)
{
if(flag == 1)
{
uint temp;
lcd_pos(0,1);
lcd_wdat(mun_char_table[shi/10]);
lcd_wdat(mun_char_table[shi%10]);
LCDWritueString(0,2," -");
lcd_pos(0,3);
lcd_wdat(mun_char_table[fen/10]);
lcd_wdat(mun_char_table[fen%10]);
LCDWritueString(0,4," -");
lcd_pos(0,5);
lcd_wdat(mun_char_table[miao/10]);
lcd_wdat(mun_char_table[miao%10]);
lcd_pos(1,1);
lcd_wdat(mun_char_table[nian/10]);
lcd_wdat(mun_char_table[nian%10]);
LCDWritueString(1,2,"年");
lcd_pos(1,3);
lcd_wdat(mun_char_table[yue/10]);
lcd_wdat(mun_char_table[yue%10]);
LCDWritueString(1,4,"月");
lcd_pos(1,5);
lcd_wdat(mun_char_table[ri/10]);
lcd_wdat(mun_char_table[ri%10]);
LCDWritueString(1,6,"日");
LCDWrituenumber(1,0,20);
/* 顯示溫度 */
temp=ReadTemperature(); //把讀到的溫度賦值給temp
LCDWritueString(3,0,"當前溫度:");
lcd_pos(3,5);
lcd_wdat(mun_char_table[temp/100]);
lcd_wdat(mun_char_table[temp%100/10]);
lcd_pos(3,6);
LCDWritueString(3,6,".");
lcd_wdat(mun_char_table[temp%10]);
LCDWritueString(3,7,"度");
if(temp >= 250)
{
beep = ~beep; //蜂鳴器滴滴
}
else
beep = 1;
}
}
/*******************************************
* 開機動畫 *
*******************************************/
void kaiji(void)
{
switch(ucStatus)
{
case 0: LCDWritueString(0,0,"大學生單片機競賽");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 1;
}
break;
case 1: LCDWritueString(0,0," ");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 2;
}
break;
case 2: LCDWritueString(1,2,"H001組");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 3;
}
break;
case 3: LCDWritueString(1,2," ");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 4;
}
break;
case 4: LCDWritueString(2,2,"只因追求");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 5;
}
break;
case 5: LCDWritueString(2,2," ");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 6;
}
break;
case 6: LCDWritueString(3,2,"源于熱愛");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 7;
}
break;
case 7: LCDWritueString(3,2," ");
if(uiStatus >= 500)
{
uiStatus = 0;
ucStatus = 8;
flag = 1;
}
break;
case 8: break;
}
}
///////////////////*******以下為按鍵模塊********///////////////////
/***********************************************
* 矩陣鍵盤掃描
***********************************************/
void Matrix_keyboar(void)
{
switch(ucMatrixStatus)
{
case 0: if(uiMatrixLieSelect == 0)
{
LIE1 = 0;LIE2 = 1;LIE3 = 1;LIE4 = 1; //每一列 第一個
}
else if(uiMatrixLieSelect == 1)
{
LIE1 = 1;LIE2 = 0;LIE3 = 1;LIE4 = 1; //每一列 第二個
}
else if(uiMatrixLieSelect == 2)
{
LIE1 = 1;LIE2 = 1;LIE3 = 0;LIE4 = 1; //每一列 第三個
}
else if(uiMatrixLieSelect == 3)
{
LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 0; //每一列 第四個
}
else
{
LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 1; //沒有列按下
}
ucMatrixStatus = 1;
break;
case 1: if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1) )//沒有行按下
{
ucMatrixStatus = 0; //重新掃描
uiMatrixLieSelect++; //逐行掃描
if(uiMatrixLieSelect > 3)uiMatrixLieSelect = 0;
}
else
{
uiMatrixCount++; //計時
if(uiMatrixCount >= 10) //消抖
{
uiMatrixCount = 0; //清零
if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
{
ucMatrixStatus = 0; //回到第一步
}
else
{
ucMatrixTemp = P2;
ucMatrixStatus = 2;
}
}
}
break;
case 2: if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
{
switch(ucMatrixTemp)
{
case 0XEE: ucKeyNumber = 1;break; //S1
case 0XDE: ucKeyNumber = 2;break; //S2
case 0XBE: ucKeyNumber = 3;break; //S3
case 0X7E: ucKeyNumber = 4;break; //S4
case 0XED: ucKeyNumber = 5;break; //S5
case 0XDD: ucKeyNumber = 6;break; //S6
case 0XBD: ucKeyNumber = 7;break; //S7
case 0X7D: ucKeyNumber = 8;break; //S8
case 0XEB: ucKeyNumber = 9;break; //S9
case 0XDB: ucKeyNumber = 10;break; //S10
case 0XBB: ucKeyNumber = 11;break; //S11
case 0X7B: ucKeyNumber = 12;break; //S12
case 0XE7: ucKeyNumber = 13;break; //S13
case 0XD7: ucKeyNumber = 14;break; //S14
case 0XB7: ucKeyNumber = 15;break; //S15
case 0X77: ucKeyNumber = 16;break; //S16
}
ucMatrixStatus = 0;
}
break;
}
}
/*************************************************
* 按鍵執行 *
*************************************************/
void keyRun(void)
{
switch(ucKeyNumber)
{
case 1: king = 1;D1 = 0;ucKeyNumber = 0;break; //暫停
case 2: miao++;if(miao>=59)miao=0;ucKeyNumber = 0;break; //秒加
case 3: miao--;if(miao<=0)miao=0;ucKeyNumber = 0;break; //秒減
case 4: fen++;if(fen>=59)fen=0;ucKeyNumber = 0;break; //分加
case 5: fen--;if(fen<=0)fen=0;ucKeyNumber = 0;break; //分減
case 6: shi++;if(shi>=23)shi=0;ucKeyNumber = 0;break; //時加
case 7: shi--;if(shi<=0)shi=0;ucKeyNumber = 0;break; //時減
case 8: king = 0;D1 = 1;ucKeyNumber = 0;break; //開啟
}
}
復制代碼
12864時鐘.rar
2019-5-11 15:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
41.65 KB, 下載次數: 18, 下載積分: 黑幣 -5
作者:
admin
時間:
2019-5-6 17:23
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
午夜电影福利
|
中文字幕精品视频在线观看
|
亚洲不卡在线观看
|
久久com
|
成人影院在线视频
|
国产成人精品免高潮在线观看
|
日本三级视频
|
亚洲国产精品视频一区
|
激情综合五月天
|
久久久久久成人
|
国产精品毛片一区二区三区
|
国产在线一区二
|
日日骚av
|
国产乱码久久久久久一区二区
|
亚洲天堂精品久久
|
精品在线一区二区
|
特级a欧美做爰片毛片
|
国产精品96久久久久久
|
久久亚洲综合
|
综合九九
|
国产成人免费视频网站视频社区
|
欧美久久一区二区
|
天天干天天操
|
韩国精品一区
|
亚洲精品1区
|
国产免费一区二区三区
|
久久com
|
午夜在线小视频
|
日韩欧美大片
|
亚洲国产一区二区三区
|
丁香一区二区
|
久久成人精品一区二区三区
|
亚洲第一区久久
|
国产美女一区
|
亚洲精品一区二区三区中文字幕
|
av网站在线看
|
日本高清中文字幕
|
懂色av一区二区三区在线播放
|
精品国产一区二区三区观看不卡
|
国产精品免费小视频
|
欧美精品一区二区三区视频
|