當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]#include #define Frequence 11 //晶振頻率單位是MHZ #define DELAY 10*Frequence/6 //發(fā)送程序延時(shí) #define SLEEP 8*Frequence/6 //發(fā)送程序延時(shí) sbit KBCLK="P3"^0; //鍵盤時(shí)鐘線 sbit KBDATA="P3"^1; //鍵盤數(shù)

#include

#define Frequence 11 //晶振頻率單位是MHZ
#define DELAY 10*Frequence/6 //發(fā)送程序延時(shí)
#define SLEEP 8*Frequence/6 //發(fā)送程序延時(shí)
sbit KBCLK="P3"^0; //鍵盤時(shí)鐘線
sbit KBDATA="P3"^1; //鍵盤數(shù)據(jù)線

bit bat(void); //基本保證測(cè)試無錯(cuò)誤返回0,有錯(cuò)返回1
unsigned char buf_length(); //返回緩沖區(qū)數(shù)據(jù)個(gè)數(shù)
bit command_s(); //鍵盤命令檢查,有命令要接受返回1
void clr_buf(void); //清鍵盤緩沖區(qū)
void del_head(); //刪除緩沖區(qū)頭
unsigned char exist(unsigned char);
//檢查鍵盤緩沖區(qū)中是否有與參數(shù)相等數(shù),有則返回位置,無則返回255

//bit emputy(); //檢查鍵盤緩沖區(qū)是否空,是返回1
unsigned char get_head(); //取鍵盤緩沖區(qū)頭,頭指針不變

unsigned char get_head_f();
//取緩沖區(qū)頭對(duì)應(yīng)標(biāo)記,標(biāo)記為0表示對(duì)應(yīng)鍵已經(jīng)松下

bit insert(unsigned char,unsigned char);
//插入緩沖區(qū),并設(shè)置對(duì)應(yīng)標(biāo)記,成功則返回1

void ini_timer01(); //定時(shí)器初始化
void receive_process(); //接收鍵盤命令并處理
void reset(); //軟件復(fù)位
unsigned char scankb(unsigned char); //掃描第N行,返回列直
void send_buf(); //發(fā)送緩沖區(qū)掃描碼

bit send_code(unsigned char _KeyNo,bit flag);
//發(fā)送按鍵掃描碼,flag=0發(fā)送斷開碼,flag=1發(fā)送接通碼

bit send(unsigned char); //發(fā)送數(shù)據(jù)

void set_default(); //設(shè)置缺省值
void set_timer1(); //復(fù)位定時(shí)器1

void set_scan_v(unsigned char); //設(shè)置掃描速度(拍發(fā)速率、延遲時(shí)間)
void set_flag(unsigned char); //設(shè)置緩沖區(qū)對(duì)應(yīng)標(biāo)記
void set_led(unsigned char); //設(shè)置LED
void secret(unsigned char);
void scan(void);
unsigned char get_end();
bit emputy(void);

//-----------------------函數(shù)聲明,變量定義--------------------------------------------------------
#include
#define KEY P1
unsigned char key_code; //鍵值
unsigned char key_buf[8]; //按鍵緩沖區(qū)
unsigned char key_COUNT; //按鍵計(jì)數(shù)器
unsigned char COUNT_TI; //定時(shí)中斷計(jì)數(shù)
//-----------------------變量聲明---------------------------------------------------------------------
void system_init(void ); //初始化,設(shè)置定時(shí)器0的工作方式,供主程序調(diào)用
void TIMER0_SCANkey(); //定時(shí)器0中斷處理函數(shù)
bit judge_hitkey(); //判斷是否有鍵按下,有返回1,沒有返回0
unsigned char scan_key(); //掃描鍵盤,返回鍵值(高四位代表行,低四位代表列)
void key_manage(unsigned char keycode); //按鍵處理
//...........每個(gè)按鍵對(duì)應(yīng)一個(gè)處理程序
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: scan_key
// 函數(shù)功能: 掃描鍵盤,返回鍵值(高四位代表行,低四位代表列)
// 無鍵按下返回0
//--------------------------------------------------------------------------------------------------
unsigned char scan_key() //掃描鍵盤,返回鍵值(高四位代表行,低四位代表列)
{
unsigned char scancode,keycode,keycode_line,keycode_row;
scancode="0xF0"; //列置低,行置高
KEY="scancode"; //輸入掃描碼,掃描行
keycode_line=KEY;
scancode="0xF0"; //列置高,行置低
KEY="scancode"; //輸入掃描碼,掃描列
keycode_row=KEY;
keycode=(((keycode_line<<4)&0xF0)|(keycode_row&0x0F));
return(keycode);
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: Timer0_init()
// 函數(shù)功能: 初始化設(shè)置
// 設(shè)定INT0的工作方式
//--------------------------------------------------------------------------------------------------
void Timer0_init(void )
{
TMOD="0x20"; //定時(shí)器0工作在方式2的定時(shí)模式
ET0=1; //定時(shí)器0中斷允許
TH0=0;
TL0=0;
TR0=1; //定時(shí)器0開始計(jì)數(shù)
EA="1"; //系統(tǒng)中斷允許
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: TIMER0_intrupt
// 函數(shù)功能: 定時(shí)器0中斷處理程序 按鍵定時(shí)查詢
//--------------------------------------------------------------------------------------------------
void TIMER0_SCANkey() interrupt 1 using 1
{
EA="0"; //系統(tǒng)中斷禁止
if((++COUNT_TI)%30==0)
{
switch(COUNT_TI/30)
{
case 1:if(scan_key()==0)
COUNT_TI=0; //無鍵按下,計(jì)數(shù)值歸零
break;
case 2:break;
case 3:if(scan_key()==0)
COUNT_TI=0; //無鍵按下,計(jì)數(shù)值歸零,上次按鍵未擾動(dòng)
else
key_code=scan_key(); //又有效建,獲取鍵值
break;
default:if(scan_key()==0) //等待按鍵釋放
key_manage(key_code); //有一個(gè)有效按鍵,調(diào)用按鍵處理程序
}
}
EA=1;
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: key_manage
// 函數(shù)功能: 有效按鍵處理
// 按鍵計(jì)數(shù)器加1,緩存區(qū)數(shù)據(jù)后移1位
//--------------------------------------------------------------------------------------------------
void key_manage(unsigned char keycode)
{
unsigned char i;
for(i=7;i>=0;i--)
{
key_buf[i]=key_buf[i-1]; //緩沖區(qū)內(nèi)數(shù)據(jù)后移1位
}
key_buf[0]= keycode; //將鍵值送入緩沖區(qū)
key_COUNT++; //按鍵計(jì)數(shù)器加一
}

//-----------------------函數(shù)聲明,變量定義--------------------------------------------------------
#include
#define KEY P1
sbit DATA="P3"^1; //數(shù)據(jù)線
sbit CLK="P3"^2; //時(shí)鐘線
unsigned char key_buf[8]; //按鍵緩沖區(qū)
unsigned char key_COUNT; //按鍵計(jì)數(shù)器
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: delay
// 入口參數(shù): N
// 函數(shù)功能:延時(shí)子程序,實(shí)現(xiàn)(16*N+24)us的延時(shí)
// 系統(tǒng)采用11.0592MHz的時(shí)鐘時(shí),延時(shí)滿足要求,其它情況需要改動(dòng)
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: CAL_jiaoyan
// 函數(shù)功能: 計(jì)算校驗(yàn)位
//--------------------------------------------------------------------------------------------------
bit CAL_jiaoyan(unsigned char byte_data)
{
//
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: SEND_byte
// 函數(shù)功能: 發(fā)送一子節(jié)數(shù)據(jù)
//--------------------------------------------------------------------------------------------------
void SEND_byte(unsigned char byte_data)
{
unsigned char i,temp;
if(CLK==0) //時(shí)鐘線為低

temp="byte"_data;
CLK="1";
DATA="0";
delay(0);
CLK="0"; //發(fā)送起始位
for(i=0;i<8;i++)
{
delay(0);
CLK="1";
DATA=(temp&0x01); //發(fā)送數(shù)據(jù)
byte_data=byte_data>>1;
delay(0);
CLK=0;
}
delay(0);
CLK="1";
DATA=CAL_jiaoyan(byte_data); //發(fā)送校驗(yàn)位
delay(0);
CLK=0;
delay(0);
CLK="1";
DATA=1; //發(fā)送結(jié)束位
delay(0);
CLK=0;
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: RECEIVE_byte
// 函數(shù)功能: 接收一子節(jié)數(shù)據(jù)
//--------------------------------------------------------------------------------------------------
unsigned char RECEIVE_byte()
{
unsigned char byte_data,i;
CLK="0";
delay(0);
CLK="1"; //接收起始位,丟棄
for(i=0;i<8;i++)
{
delay(0);
CLK="0";
delay(0);
CLK=1;
byte_data=byte_data>>1;
if(DATA=1)
byte_data=byte_data|0x80;
else
byte_data=byte_data&0x7F; //接收8位數(shù)據(jù)
}
for(i=0;i<2;i++)
{
delay(0); //接收校驗(yàn)位和結(jié)束位
CLK="0";
delay(0);
CLK=1;
}
return(byte_data);
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: manage
// 函數(shù)功能: 主機(jī)命令處理函數(shù)
//--------------------------------------------------------------------------------------------------
void manage(unsigned char rec_data)
{
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: SEND_keydata
// 函數(shù)功能: 發(fā)送按鍵值到主機(jī)
//--------------------------------------------------------------------------------------------------
void SEND_keydata()
{
unsigned char ASCII_code; //
// ASCII_code=judge_key(key_buf[key_COUNT]); //判斷鍵值,按鍵編碼成ASCII碼
SEND_byte(ASCII_code);
key_COUNT--;
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: 主程序
// 函數(shù)功能: 循環(huán)查詢主機(jī)狀態(tài)
//--------------------------------------------------------------------------------------------------
void main()
{
unsigned char rec_data;
while(1)
{
if(CLK==0&&DATA==0)
{
rec_data=RECEIVE_byte(); //接收主機(jī)鍵盤
manage(rec_data); //指令處理函數(shù)
}
if(key_COUNT!=0&&CLK==1) //有按鍵等待處理
//線路空閑
SEND_keydata();
}
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉