視頻鏈接:https://www.bilibili.com/video/BV1at4y117Eq
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;
sbit KEY = P3^0;
sbit h1 = P1^0;
sbit h2 = P1^1;
sbit h3 = P1^2;
sbit h4 = P1^3;
sbit l1 = P1^4;
sbit l2 = P1^5;
sbit l3 = P1^6;
sbit l4 = P1^7;
/*******************************************************************************
* 函 數(shù) 名 : Lcd1602_Delay1ms
* 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
* 輸 入 : c
* 輸 出 : 無
* 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //誤差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteCom
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteData
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LcdInit()
* 函數(shù)功能 : 初始化LCD屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
X |= 0x80; // 算出指令碼
LcdWriteCom(X); //這里不檢測忙信號,發(fā)送地址碼
LcdWriteData(DData);
}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到達(dá)字串尾則退出
{
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
void KEY_scan()
{
if(KEY==0)
{
Lcd1602_Delay1ms(20);
if(KEY==0)
{
while(KEY==0);
}
}
}
void key_scan1()
{
h1=1;
h2=1;
h3=1;
h4=1;
l1=1;
l2=1;
l3=1;
l4=1;
h1=0;
if(l1==0 && h1==0 && h2==1 && l2==1 && l3==1 && l4==1 ) //1
{
while(l1==0);
DisplayOneChar(0,0,'0');
}else if(l1==1 && h1==0 && h2==1 && l2==0 && l3==1 && l4==1 ) //2
{
while(l2==0);
DisplayOneChar(0,0,'1');
}else if(l1==1 && h1==0 && h2==1 && l2==1 && l3==0 && l4==1)//3
{
while(l3==0);
DisplayOneChar(0,0,'2');
}else if(l1==1 && h1==0 && h2==1 && l2==1 && l3==1 && l4==0)//4
{
while(l4==0);
DisplayOneChar(0,0,'3');
}
else
{
h1=1;
h2=0;
if(l1==0 && h1==1 && h2==0 && l2==1 && l3==1 && l4==1 )//6
{
while(l1==0);
}else if(l1==1 && h1==1 && h2==0 && l2==0 && l3==1 && l4==1 )//7
{
while(l2==0);
}else if(l1==1 && h1==1 && h2==0 && l2==1 && l3==0 && l4==1)//8
{
while(l3==0);
}else if(l1==1 && h1==1 && h2==0 && l2==1 && l3==1 && l4==0)//9
{
while(l4==0);
}else
{
h1=1;
h2=1;
h3=0;
if(l1==0 && h1==1 && h2==1 && h3==0 && l2==1 && l3==1 && l4==1)//11
{
while(l1==0);
}else if(l1==1 && h1==1 && h2==1 && h3==0 && l2==0 && l3==1 && l4==1)//12
{
while(l2==0);
}else if(l1==1 && h1==1 && h2==1 && h3==0 && l2==1 && l3==0 && l4==1)//13
{
while(l3==0);
}else if(l1==1 && h1==1 && h2==1 && h3==0 && l2==1 && l3==1 && l4==0 )//14
{
while(l4==0);
}
else
{
h3=1;
h4=0;
if(l1==0 && h1==1 && h2==1 && h3==4 && l2==1 && l3==1 && l4==1)//11
{
while(l1==0);
}else if(l1==1 && h1==1 && h2==1 && h3==4 && l2==0 && l3==1 && l4==1)//12
{
while(l2==0);
}else if(l1==1 && h1==1 && h2==1 && h3==4 && l2==1 && l3==0 && l4==1)//13
{
while(l3==0);
}else if(l1==1 && h1==1 && h2==1 && h3==4 && l2==1 && l3==1 && l4==0 )//14
{
while(l4==0);
}
}
}
}
}
void main()
{
LcdInit();
EA=1; //全局中斷開
EX0=1; //外部中斷0開() EX1 為外部中斷1 (P3^3)
IT0=1; //低電平觸發(fā) IT1為中斷1
EX1=1; //外部中斷0開() EX1 為外部中斷1 (P3^3)
IT1=1; //低電平觸發(fā) IT1為中斷1
/*
DisplayOneChar(0,0,(char)(datt/100+'0'));
DisplayOneChar(1,0,(char)(datt/10%10+'0'));
DisplayOneChar(2,0,(char)(datt%10+'0'));
*/
while(1)
{
key_scan1();
}
}
void Key_INT1( ) interrupt 0 // INT0 1 INT1 2
{
DisplayOneChar(0,0,'A');
}
void Key_INT2( ) interrupt 2 // INT0 1 INT1 2
{
DisplayOneChar(0,0,'B');
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
106515 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41470 -
矩陣
+關(guān)注
關(guān)注
0文章
423瀏覽量
34528 -
按鍵
+關(guān)注
關(guān)注
4文章
223瀏覽量
57595
發(fā)布評論請先 登錄
相關(guān)推薦
伺服電機(jī)的三種控制方式
伺服電機(jī)控制方式有脈沖、模擬量和通訊這三種,在不同的應(yīng)用場景下,我們該如何選擇伺服電機(jī)的控制方式呢?
發(fā)表于 08-17 11:01
?7096次閱讀
STM32F767+STM32CubeMX I2C通信讀寫EEPROM數(shù)據(jù)(采用輪詢、DMA、中斷三種方式)精選資料推薦
STM32F767+STM32CubeMX I2C通信讀寫EEPROM數(shù)據(jù)(采用輪詢、DMA、中斷三種方式)摘要-前言作為一名STM32的初學(xué)者,在學(xué)習(xí)過程中會遇到很多問題,解決過程中
發(fā)表于 08-23 09:08
基于Proteus嵌入式仿真平臺中三種源碼調(diào)試的方式分析
就是能對嵌入式系統(tǒng)(硬、軟件)及其外圍電路進(jìn)行協(xié)同、動態(tài)、交互式的仿真,并提供了仿真中進(jìn)行源碼調(diào)試的三種方式。
深度解讀伺服電機(jī)的三種控制方式
伺服電機(jī)控制方式有脈沖、模擬量和通訊控制這三種,在不同的應(yīng)用場景下,該如何確定選擇伺服電機(jī)控制方式
發(fā)表于 02-03 06:46
?38次下載
Proteus中以中斷方式實(shí)現(xiàn)矩陣鍵盤的掃描
前言最近做單片機(jī)的課程設(shè)計(jì)用到矩陣鍵盤,在此做個記錄。1 矩陣鍵盤的掃描方式使用矩陣鍵盤時(shí),首先要判斷是否有按鍵按下,這個過程稱為
發(fā)表于 11-26 12:21
?9次下載
淺談伺服電機(jī)的三種控制方式
伺服電機(jī)控制方式有脈沖、模擬量和通訊控制這三種,在不同的應(yīng)用場景下,該如何確定選擇伺服電機(jī)控制方式
發(fā)表于 07-26 09:22
?1720次閱讀
HDMI無縫拼接矩陣的三種模式
HDMI無縫拼接矩陣的三種模式? HDMI無縫拼接矩陣是一種在多個顯示屏之間實(shí)現(xiàn)無縫切換和拼接的高級視頻處理設(shè)備。它的出現(xiàn),解決了傳統(tǒng)拼接方式
變頻器的三種控制方式 | 變頻器三種控制方式的優(yōu)缺點(diǎn)
? ? ? 變頻器是一種電力調(diào)節(jié)設(shè)備,它通過改變電機(jī)的工作頻率來調(diào)節(jié)電機(jī)的轉(zhuǎn)速。在實(shí)際應(yīng)用中,變頻器通常采用三種控制方式:開環(huán)控制、閉環(huán)
運(yùn)動控制的三種控制方式
非標(biāo)項(xiàng)目中有非常多的運(yùn)動控制,根據(jù)系統(tǒng)配置、電機(jī)類型以及精度需求的不同主要有三種控制方式:開環(huán)控制、半閉環(huán)
簡述斬波電路的三種控制方式
斬波電路是一種常見的電力電子器件,廣泛應(yīng)用于直流電壓調(diào)節(jié)、電壓變換、電流變換等領(lǐng)域。它可以實(shí)現(xiàn)對電流和電壓的控制,以滿足不同的電氣設(shè)備的需求。斬波電路的控制方式主要有
評論