51學習筆記《二》
一、數碼管
數碼管是一種可以顯示數字和其他信息的電子設備。玻璃管中包括一個金屬絲網製成的陽極和多個陰極。大部分數碼管陰極的形狀爲數字。圖片如下:
數碼管可以用來顯示輸出結果,一些字母等。主要是一個顯示設備。
8位共陰極數碼管原理圖:
數碼管顯示分爲靜態顯示和動態顯示
靜態顯示 | 動態顯示 | |
---|---|---|
特點 | 每個數碼管必須接在一個8位數據線來保持現實的字形碼。當送入一次字形碼字形可以一直保持,直到下一次送入新的字形 。只能顯示一位數字 | 所有位選碼管的段選線並聯在一起,由位選線程控制位有效選亮數碼管採取動態掃描顯示,這樣就可以通過人眼的視覺延遲來點亮多個數碼管 |
顯示代碼 | 代碼1[^1] | 代碼2[^2] |
[^1]:靜態顯示1
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;//數碼管段選
sbit WE=P2^7;//數碼管位選
//毫秒級延時函數
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
WE=1;//打開位選鎖存器
P0=0xfe; //1111 1110
WE=0;//關閉位選鎖存器
DU=1;//打開段選鎖存器
P0=0X06;//0000 0110x顯示1
DU=0;//關閉位選鎖存器
while(1)
{
P0=0x01;
}
}
所謂的段選就是選擇要點亮那個數碼管,位選就是要讓數碼管顯示的數。
[^2]:動態顯示123
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;//段選
sbit WE=P2^7;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
while(1)
{
P0=0xff;
WE=1;
P0=0XFE;
WE=0;
DU=1;
P0=0X06;
DU=0;
delay(5);
P0=0xff;
WE=1;
P0=0XFD;
WE=0;
DU=1;
P0=0X5B;
DU=0;
delay(5);
P0=0xff;
WE=1;
P0=0XFB;
WE=0;
DU=1;
P0=0X4F;
DU=0;
delay(5);
}
}
我們可以發現通過以上方式實現數碼管的顯示比較麻煩,我們可以定義一個數碼管顯示函數,通過調用這個函數改變函數的參數來實現數碼管顯示的數。代碼如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;//
sbit WE=P2^7;
uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//數碼管顯示數組表示0,1,2,3,4,5,6,7,8,9
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(uchar i)//計算出個位、十位、百位的數並顯示
{
uchar bai,shi,ge;
bai=i/100;
shi=(i%100)/10;
ge=i%10;
P0=0xff;//清除斷碼
WE=1;
P0=0XFE; //1111 1110
WE=0;
DU=1;//???????????
P0=a[bai];//0000 0110
DU=0;
delay(5);
P0=0xff;
WE=1;
P0=0XFD;
WE=0;
DU=1;
P0=a[shi];
DU=0;
delay(5);
P0=0xff;//
WE=1;
P0=0XFB;
WE=0;
DU=1;
P0=a[ge];
DU=0;
delay(5);
}
void main()
{
while(1)
{
display(200);
}
}
二、獨立鍵盤與矩陣鍵盤
基礎知識:按鍵按照結構原理科分爲兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關燈;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。
對於一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以採用查詢或中斷方式瞭解有無將按鍵輸入,並檢查是哪一個按鍵按下,將該鍵號送人累加器,然後通過跳轉指令轉入執行該鍵的功能程序,執行完成後再返回主程序。
上圖就是矩陣鍵盤的樣子。同時附上按鍵按下電壓變化圖:
所以並不是按鍵按下就會成爲高電壓,而有按鍵抖動。所以每次按鍵按下要使用延時函數進行按鍵消抖判斷是否按下和鬆開。
原理圖如下:
根據原理圖寫程序獨立鍵盤進行加減並且數碼管顯示:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;
sbit WE=P2^7;
sbit key_s2=P3^0;
sbit key_s3=P3^1;
uchar num;
uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
WE=1;
P0=0XFE;
WE=0;
while(1)
{
if(key_s2==0)
{
delay(20);
if(key_s2==0)
{
num++;
if(num==10)
{
num=0;
}
while(!key_s2);//鬆手檢測
}
}
if(key_s3==0)
{
delay(20);//按鍵消抖
if(key_s3==0)
{
if(num>0)
{
num--;
}
while(!key_s3);//判斷是否鬆手
}
}
DU=1;
P0=a[num];
DU=0;
}
}
這樣就能實現S2按下num加,S3按下num減。
同時鍵盤還能作爲輸入工具,接下來的程序將實現每按下一個按鍵數碼管顯示一個字符。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU=P2^6;
sbit WE=P2^7;
uchar num;
uchar keyvalue=20;//按鍵值
//數碼管顯示數組
uchar table[]={
//0 1 2 3 4 5 6 7 8
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
//9 a b c d e f h l
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x38,
//n u
0x37,0x3e,0x40,0x00};
uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void keyscan()
{
//4*4鍵盤掃描函數
P3=0xf0;
if(P3!=0XF0)//判斷按鍵是否按下
{
delay(10);//按鍵消抖
if(P3!=0x0f)//再次判斷
{
switch(P3)
{
case 0xe0:keyvalue=0;break; //第一列
case 0xd0:keyvalue=1;break; //第二列
case 0xb0:keyvalue=2;break;
case 0x70:keyvalue=3;break;
}
P3=0x0f;//行掃描
switch(P3)
{
case 0x0e:keyvalue=keyvalue;break;
case 0x0d:keyvalue=keyvalue+4;break;
case 0x0b:keyvalue=keyvalue+8;break;
case 0x07:keyvalue=keyvalue+12;break;
}
while(P3!=0x0f);
}
}
P3=0xff;
if(P3!=0XFF)
{
delay(10);
if(P3!=0XFF)
{
switch(P3)
{
case 0xfe:keyvalue=16;break;
case 0xfd:keyvalue=17;break;
case 0xfb:keyvalue=18;break;
case 0xf7:keyvalue=19;break;
}
while(P3!=0xff);
}
}
}
void main()
{
WE=1;
P0=0XFE;
WE=0;
while(1)
{
keyscan();//矩陣鍵盤掃描函數
DU=1;
P0=table[keyvalue];數碼管顯示
DU=0;
}
}
這樣就能將數碼管與鍵盤結合,一個輸入一個輸出。