兩個while(1)不可能同時存在,那么怎么改動才能合二為一呢
程序1 喇叭
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P2^0; //定義喇叭輸出端口
uchar tick,tl,th; //定義節拍和T0初值變量
uchar TABLE[]={ //音符節拍表
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x00};
uchar TABLE1[]={ //定時器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
//T0中斷服務函數
timer0()interrupt 1 using 1{
TL0=tl;TH0=th;//低八位定時器和高八位定時器
BEEP=~BEEP;
}
//基本單位延時函數
void delay1(){
uint i;
for(i=0;i<20000;i++);
}
//節拍延時函數
void delay(tt){
uchar i;
for(i=0;i<=tt;i++)delay1();
}
//主函數
void main(){
uchar t,t1,k=0;
while(1){
TMOD=0x01;IE=0x82;// T0工作于模式1,即16位定時器模式.IE是中斷允許寄存器,D7置1表示允許CPU中斷,D1置1表示允許T0溢出中斷.
while(TABLE[k]!=0)
{ tick=(TABLE[k])&0x0f;
t=(_crol_(TABLE[k],4))&0x0f;
if(t!=0){
t1=--t*2+1;
t=t*2;
tl=TL0=TABLE1[t1];
th=TH0=TABLE1[t];
TR0=1;
}
else TR0=0;
delay(tick);
k++;
}
TR0=0;
}
}
==========================
程序2 點陣
#include<reg52.h>
#include<intrins.h>
//intrins.h函數,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用
//OE 第13腳 輸出有效(低電平)
//MR 第10腳 主復位(低電平)
typedef unsigned char uchar;
typedef unsigned int uint;
/**********管腳說明********************/
#define P P1 //define 不用加;
sbit SER = P3^4; //p3.4串行數據輸入 DS
sbit SCK = P3^6; //串行輸入時鐘,上升沿有效 SHCP 第11腳 數據輸入時鐘線
sbit RCK = P3^5; //串行寄存器時鐘,上升沿有效 STCP 第12腳 輸出存儲器鎖存時鐘線
/***********************************/
/**********函數聲明********************/
void SendTo595(uchar byteData);
/***********************************/
/**********全局參數聲明********************/
char shu=0xFE;
/***********************************/
void delay(unsigned int n)//延時函數
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void hang()//行掃描
{
P=shu;
shu=_crol_(shu,1);
}
char a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,
0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main()
{
int i,b=0;
while(1)
{
int num=12;
while(num--)
{
for(i=0;i<8;i++)
{
hang(); //先位選再段選
SendTo595(a[i+b]);
delay(3);
}
//P=0xFF;
//SendTo595(0x00);
}
b++;
if(b>=24)b=0;
//P=0xFF;
}
}
//發送一個字節數據給595再并行輸出
void SendTo595(uchar Data)
{
int j=0;
for(j;j<8;j++)
{
SCK = 0;
SER=0x80&Data;//&為按位運算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
Data=_crol_(Data,1); //左移一位 將高位補給低位,如果二進制數為01010101 那么_crol_(1) 為10101010
SCK = 1; //上升沿讓串行輸入時鐘變成高電平 并延時兩個時鐘周期
_nop_();
}
/*位移寄存器完畢,轉移到存儲寄存器*/
RCK = 0;
RCK = 1; //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
_nop_();
RCK = 0;
}
里面部分重復的變量名我自己會改,只想解決main里面怎么合并的問題
|