導航:首頁 > 操作系統 > 單片機數字加名字的代碼

單片機數字加名字的代碼

發布時間:2022-12-16 16:43:14

Ⅰ 通過鍵盤往單片機中輸入任意數字的C語言程序

我這有個AVR的矩陣鍵盤的識別程序、其中PORTA就相當於51里的P0一樣的埠的表示、PINA也是指的PORTA口、和PORTA的區別是PINA只能讀!其他都一樣的和51
/********************************************************
實驗七: 矩陣式鍵盤實驗
說明: 按按鍵K1-K16 數碼管顯示0-F的鍵碼
注意: K17-K19為獨立按鍵,使用這個程序是沒有反應的

CPU型號: ATMEGA128A
晶振頻率: 8MHZ
日期: 2011-3-12
聯系方法: [email protected]
********************************************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void Delayus(uint US); //微秒延時子程序
void Delayms(uint MS); //毫秒延時子程序
uchar key_scan(void);
void init_io(void);
//共陽數碼管數字碼
uchar led_discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uchar key_val=0;
//主函數
void main (viod)
{
uchar key_io;
init_io();
while(1)
{
PORTD=0XF0;
Delayms(5);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
PORTD=0XF0;
Delayms(1);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
key_val=key_scan();
key_val |= key_io;
}
switch(key_val)
{
case 0xee: key_val=0x00; break; //按鍵K1

case 0xde: key_val=0x01; break; //按鍵K2

case 0xbe: key_val=0x02; break; //按鍵K3

case 0x7e: key_val=0x03; break; //按鍵K4

case 0xed: key_val=0x04; break; //按鍵K5

case 0xdd: key_val=0x05; break; //按鍵K6

case 0xbd: key_val=0x06; break; //按鍵K7

case 0x7d: key_val=0x07; break; //按鍵K8

case 0xeb: key_val=0x08; break; //按鍵K9

case 0xdb: key_val=0x09; break; //按鍵K10

case 0xbb: key_val=0x0a; break; //按鍵K11

case 0x7b: key_val=0x0b; break; //按鍵K12

case 0xe7: key_val=0x0c; break; //按鍵K13

case 0xd7: key_val=0x0d; break; //按鍵K14

case 0xb7: key_val=0x0e; break; //按鍵K15

case 0x77: key_val=0x0f; break; //按鍵K16
} // switch(key_val)
} // if(key_io !=0xf0)

PORTD=0XF0;
//等待松開按鍵
key_io=PIND & 0xf0;
while(key_io !=0xf0)
{
key_io=PIND & 0xf0;
}
PORTC=led_discode[key_val]; //顯示按鍵碼
} // while(1)
}
void init_io(void)
{
DDRA=0XFF;//設置A口味輸出
PORTA=0XFF;

DDRB=0XFf;;//設置B口味輸出
PORTB=0XFF; //數碼管位控制

DDRC=0XFF; //數碼管段控制
PORTC=0X00;

DDRD=0X0F; //鍵盤介面
PORTD=0XF0;

DDRF=0X0E;
PORTF=0X0E;
PORTF&=0XF7; //鎖存關閉LED顯示

DDRB |=0X10; //PB4設為輸出
PORTB|=0X10; //關閉PB4外接的LED
}
uchar key_scan(void)
{
uchar m,temp=0xf7;
for(m=0;m<4;m++)
{
PORTD=temp | 0xf0;
Delayms(1);
if((PIND & 0XF0)!=0XF0)
return(temp & 0x0f);
temp>>=1;
}
}
/****************************************************
函數名稱: Delayus
功 能: 延時指定微秒(8M晶振)
參 數: US--延時的微秒數(大約,不是很精確,MS越大越准確)
返回值 : 無
/****************************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4;
for( i=0;i<US;i++);
}
/****************************************************
函數名稱: Delayms
功 能: 延時指定毫秒(8M晶振)
參 數: MS--延時的毫秒數
返回值 : 無
通過軟體模擬反復實驗得到的數值
/****************************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++);
}

Ⅱ 求大神幫忙在這段單片機代碼加一下注釋

先說下,你的程序格式寫的太佔用空間了,而且看著也不夠整潔


已經幫你都注釋了,格式也做了調整,部分沒有調整,方便添加註釋


/***************************************************************************/

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit P26=P2^6; sbit P27=P2^7;//數碼管片選控制用埠定義

sbit P20 =P2^0; sbit P21 =P2^1; sbit P22 =P2^2;//按鍵埠定義

uchar tt,a,b,c,d,e,f,second,minite, hour;//定義時分秒變數

uchar code smg[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//數碼管控制位

uchar code shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xbf};//數字0-9

void display(uchar a,uchar b,uchar c,uchar d ,uchar e,uchar f);//數碼管顯示函數定義

void delay(uint z);//延時函數定義

/***************************************************************************/

void keyscan()

{

TR1=0;//關閉定時器

P2 |=0x07;//初始化 P2 埠狀態

if(P20==0)//如果按鍵被按下

{

delay(10);//延時去抖動

{

if(P20==0)//再次判斷按鍵是否被按下

{

hour++;//小時 加一

if(hour==24){hour=0;}//如果達到24小時,則從0在開始

while(P20==0);//等待該按鍵松開

}

}

}//以下類推


if(P21==0){delay(10);if(P21==0){minite++;if(minite==60)minite=0;while(P21==0);}}

if(P22==0){delay(10);if(P22==0){second++;if(second==60)second=0;while(P22==0);}}

TR1=1;//打開定時器

}

/***************************************************************************/

void main()

{

hour=12; //初始化小時 變數

TMOD=0x10; //設置定時器1和計數器0

TH1=(65536-50000)/256; //定時器裝初值,高四位

TL1=(65536-50000)%256; //定時器裝初值,低四位

TR1=1; //啟動定時器1

ET1=1; //啟動定時器1中斷

EA=1; //開總中斷

P2 |=0x07; //初始化 P2 埠狀態

while(1) //主循環

{

keyscan(); //調用按鍵處理函數

if(tt==60){tt=0;second++;} //如果達到60毫,秒加一

if(second==60){second=0;minite++;} //如果達到60秒,分加一

if(minite==60){minite=0;hour++;} //如果達到60分,小時加一

if(hour==24){hour=0;} //如果達到24小時,則從0在開始


f=second%10; e=second/10; //分離秒個位與十位的數值

d=minite%10; c=minite/10; //分離分個位與十位的數值

b=hour%10; a=hour/10; //分離小時個位與十位的數值

}

}

/***************************************************************************/

void display(uchar a,uchar b,uchar c,uchar d ,uchar e,uchar f)//數碼管顯示函數

{

P27=1; P1=smg[7]; P27=0; P26=1; P1=shuzi[f]; P26=0; P1=0; delay(1);//秒個位

P27=1; P1=smg[6]; P27=0; P26=1; P1=shuzi[e]; P26=0; P1=0; delay(1);//秒十位

P27=1; P1=smg[5]; P27=0; P26=1; P1=0xbf; P26=0; P1=0; delay(1);//分隔符

P27=1; P1=smg[4]; P27=0; P26=1; P1=shuzi[d]; P26=0; P1=0; delay(1);//分個位

P27=1; P1=smg[3]; P27=0; P26=1; P1=shuzi[c]; P26=0; P1=0; delay(1);//分十位

P27=1; P1=smg[2]; P27=0; P26=1; P1=0xbf; P26=0; P1=0; delay(1);//分隔符

P27=1; P1=smg[1]; P27=0; P26=1; P1=shuzi[b]; P26=0; P1=0; delay(1);//時個位

P27=1; P1=smg[0]; P27=0; P26=1; P1=shuzi[a]; P26=0; P1=0; delay(1);//時十位

}

/***************************************************************************/

void timer1() interrupt 3 //定時器中斷函數

{

TH1=(65536-10000)/256; TL1=(65536-10000)%256;//重裝定時器初值

tt++; display(a,b,c,d,e,f);//計數器 tt 累加,以及調用數碼管顯示函數

}

/***************************************************************************/

void delay(uint z) //延時函數

{uint t1,y; for(t1=z;t1>0;t1--){for(y=125;y>0;y--);}}//標準的 for 嵌套循環

/***************************************************************************/

Ⅲ 51單片機編寫lcd1602顯示程序,第一行顯示自己的姓名,第二行顯示學號

1、首先我們打開Keil μVision編譯器,新建一個工程,然後保存在硬碟上的位置,然後選擇Atmel-AT89C51單片機為模型,並啟動器添加STARTUP.A51文件,然後在當前目錄下新建一個C文件,並將其添加入工作路徑。

Ⅳ C語言單片機編程。詳解下面兩段代碼,解釋區別,以及後面的代碼載入後問題原因。

wela和la在兩段代碼里,都有類似的不同:先0後P0賦值再1,或者是先1後P0賦值再0,這樣的差別對應的就是輸出波形的時序不同。如果碰到對時序要求高的,會導致異常結果。

Ⅳ 單片機的加法指令中ADD與ADDS的區別

ADD不帶進位加法指令;
指令名稱:寄存器加法指令
指令代碼:28H~2FH
指令功能:累加器內容與寄存器內容相加 操作內容:A←(A)+(Rn), n=0~7 位元組數: 1
機器周期:1
影響標志位:C,AC,OV
ADDS是32位數的加法運算,影響進位標志位C而不影響運算結果的值,ADCS是大於32位數的加法,低32位數相加的結果影響標志位C的值(作為進位值)就得加到高32位數的相加運算里去,以此類推,可做高32數的加法。
例: 加兩個 128 位的數
128 位結果:寄存器 0,1,2, 3
第一個 128 位數: 寄存器 4,5,6,7
第二個 128 位數: 寄存器 8,9,10,11
ADDS R0, R4, R8 ; 加低端的字,影響C
ADCS R1, R5, R9 ; 加下一個字, +C
ADCS R2, R6, R10 ; 加第三個字, +C
ADCS R3, R7, R11 ; 加高端的字, +C

Ⅵ 單片機C51編程(C語言):實現學號的顯示(學號是10位數字)

你用什麼驅動數碼管呢?
不同的驅動,程序寫法不同。
如果直接用I/O口驅動,8位數碼管就這樣寫:
wei=位選
an=段選
//斷碼表
uchar
code
shuzi[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,
0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,
0x00,0xff};
void
led_scan(void)
{
uchar
i,j;//共陽數碼管
wei=0xff;
j=0x01;
for(i=0;i<8;i++)
{
an=shuzi[i];
wei=!j;
delay(200);
j<<=1
;
}
wei=0xff;
}

Ⅶ 關於單片機數碼管的C語言代碼,高分求詳解,先謝過

一、LedNumVal%10000/1000 %是模,取余數的意思,%10000,得到的數最大是四位數。 /是整除的意思不帶小數,如8/3=2 一個小於10000的數,整除1000結果一定是0到9之間的一個數
二、Disp_Tab 以及LedOut, dispbit都是數組,根據相應的數可得到對應的字元數據,達到位選的功能。

Ⅷ 單片機加法類指令

CLR
A
並不清理進位
帶進位與0相加時,就把進位(只可能是0或1)放進A


然後再傳送出去
53單元也只能是0或1

Ⅸ 求單片機 數字鍾 c語言代碼注釋

#include<reg51.h>
unsigned char code su[11]={0x3f,0x06,0x5b,0X4F,0x66,0X6D,0x7d,0x07,0x7f,0x6f,0x40};//數碼管顯示
unsigned char xian[8]={0,0,10,0,0,10,0,0};
unsigned char sen=0,min=0,hou=0,sen2=0,min2=0,hou2=0,sen3=59,min3=59,hou3=23,num;//變數定義
//--------引腳定義
sbit ks=P1^4; //秒按鍵
sbit km=P1^5; //分按鍵
sbit kh=P1^6; //時按鍵
sbit ds=P1^7;
sbit bb=P3^4;

//-------8個數碼管位顯示介面
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;

bit jp1,jp2,jp3;//位定義
int n=0,jp4;
//----演示程序
void daly()
{
unsigned char j;
for(j=60;j;j--);//for循環
}

//------數碼管顯示
void show()
{
xian[0]=hou/10; //時的十位
xian[1]=hou%10; //時的個位
xian[3]=min/10; //分的十位
xian[4]=min%10; //分的個位
xian[6]=sen/10; //秒的十位
xian[7]=sen%10; //秒的個位

P0=su[xian[7]]; //八段數碼管顯示秒的個位
P20=0; //動態顯示,打開第一個數碼管
daly(); //延時
P20=1; //動態顯示,關閉第一個數碼管

P0=su[xian[6]];//八段數碼管顯示秒的十位
P21=0;//動態顯示,打開第二個數碼管
daly();//延時
P21=1;//動態顯示,打開第二個數碼管
//--------------------
P0=su[xian[5]];//註:你xian[3]xian[5]都為從定義
P22=0;
daly();
P22=1;

//-------------分個位的顯示
P0=su[xian[4]];
P23=0;
daly();
P23=1;
//-----------
P0=su[xian[3]];//註:你xian[3]xian[5]都為從定義
P24=0;
daly();
P24=1;
//------------分十位的顯示
P0=su[xian[2]];
P25=0;
daly();
P25=1;
//-------------時個位的顯示
P0=su[xian[1]];
P26=0;
daly();
P26=1;
//-----------時十位的顯示
P0=su[xian[0]];
P27=0;
daly();
P27=1;
}

//---------按鍵程序
void key()
{
if((ks==0)&&(jp1==0))
{
jp1=1;//秒按鍵生效
daly();//消抖
if(ks==0) sen++; //秒加1
}
else if((ks==1)&&(jp1==1)) jp1=0;//秒按鍵未生效

if(sen==60)//等於60時
{
min++;//分加1
sen=0;//秒清零
}
if((km==0)&&(jp2==0))
{
jp2=1;//分按鍵生效
daly();//消抖
if(km==0) min++;//分加1
}
else if((km==1)&&(jp2==1)) jp2=0;//分按鍵未生效
if(min==60)//等於60時
{
hou++;//時加1
min=0;//分清零
}
if((kh==0)&&(jp3==0))
{
jp3=1;//時按鍵生效
daly(); //消抖
if(kh==0) hou++;//時加1
}
else if((kh==1)&&(jp3==1)) jp3=0;//時按鍵未生效
if(hou==24) hou=0;//時為24時,清零
if(ds==0)//定時操作
{
daly();//消抖
while(ds==0);
daly();
if(ds==1) jp4++;//定時按鍵生效,加一
if(jp4>1) jp4=0;//JP4隻能是一。
/*註:就本人感覺而言這兩句就是廢話,一句就能完事:if(ds==1) jp4=1;*/
}
}

//-------從功能上看這是定時
dings()
{
EA=0; //關閉中斷
TR0=0;//T0停止計數
hou2=hou;//把現有的時分秒,保留儲存在hou2,min2,sen2
min2=min;
sen2=sen;
hou=0; //清零
min=0;
sen=0;
while(jp4==1) //等待直到按鍵生效
{
hou3=hou; //把現有的時分秒,保留儲存在hou3,min3,sen3
min3=min;
sen3=sen;
show(); //現實
key();//按鍵掃描
hou3=hou;//把按鍵後更改的時分秒,也就是定時時間,保留儲存在hou3,min3,sen3
min3=min;
sen3=sen;
}
hou=hou2;//把遠有的時間分別還原
min=min2;
sen=sen2;
EA=1;//開中斷
TR0=1;//T0計數
}

void main()
{
TMOD=0x01;//定時器0方式1
TH0=45535>>8;//賦初值
TL0=45535;
EA=1; //允許中斷
ET0=1;//T0中斷使能
EX1=1;//外部中斷1
TR0=1;//T0開始計數

hou3=99;
min3=99;
sen3=99;

while(1)
{
show();//顯示
key();//按鍵程序
dings();//定時操作
if(((hou*60+min))*60+sen>=((hou3*60+min3))*60+sen3 )//判斷是否到了定時時間
{
bb=0;//蜂鳴器鳴叫(也可能是其他音樂晶元)
num++;
if(num>=500) //鳴叫延時
{
bb=1; //蜂鳴器關閉
num=0; //延時計數清零
jp4=0;//位清零
hou3=99;//重新賦值
min3=99;
sen3=99;
}
}
}
}

void_time0_(void)interrupt 1
{
TL0=45535; //定時器0重新賦值
TH0=45535>>8;
if(++n==50) //1秒
{
n=0;
sen++; //秒加1
if(sen==60) //加到60
{
min++;
sen=0;
}//分加1
if(min==60)//加到60
{
hou++;
min=0;
}//時加1
if(hou==24) hou=0;//24時,時變成0
}
}
說實話,這個程序編寫的很爛。

閱讀全文

與單片機數字加名字的代碼相關的資料

熱點內容
51單片機程序單步視頻 瀏覽:239
家庭寬頻如何連接伺服器 瀏覽:117
汽車高壓泵解壓 瀏覽:770
上門正骨用什麼app 瀏覽:758
安卓為什麼免費使用 瀏覽:397
加密貨幣都有哪些平台 瀏覽:625
python和matlab難度 瀏覽:388
python爬蟲很難學么 瀏覽:572
小米解壓積木可以組成什麼呢 瀏覽:816
為什麼滴滴出行app還能用 瀏覽:564
怎麼升級手機android 瀏覽:923
php權威編程pdf 瀏覽:994
扣扣加密技巧 瀏覽:720
蘋果如何創建伺服器錯誤 瀏覽:497
軟考初級程序員大題分值 瀏覽:475
js壓縮視頻文件 瀏覽:580
linux如何通過命令創建文件 瀏覽:991
應用加密app還能訪問應用嘛 瀏覽:435
安卓怎麼用支付寶交違章罰款 瀏覽:667
php面向對象的程序設計 瀏覽:506