📄 st_rgb122x32.c
字号:
#include<STC58RD.H>
//#include<REGX52.h>
//#include "reg52.h"
#include <intrins.h>
#include "nRF905.H"
#include "absacc.h"
#include "head.h"
//#include "led.C"
#define uchar unsigned char
#define uint unsigned int
/******************************************************
延时函数
*******************************************************/
void Send_905(uchar addr,uchar *BUF);
void Display_Menu_1(void);
void delay_1ms(uint times)//delay 1 ms,for 12MHZ
{ uchar i;
while(times--)
for(i=0;i<121;i++) ;
{_nop_();}
}
void delay_60ms(int i)
{
while(i--)
{if(Cls_stype) break;
Display_Menu_1();
}
}
void Display_Menu_1(void)
{ uchar i;
Xiaoguo=Sys_info[0];
//speed=Speed_;
tx_type=Tx_type_;
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x16(0,2,8,10);//(
Pintf_8x16(0,2,98,11);//)
for(i=0;i<4;i++)
{ Pintf_12x16(0,2,33+i*13,((Xiaoguo-1)%5)*4+9+i);} //当前显示模式
Pintf_8x8(0,2,114,10+(tx_type%2));//通信标志 0:无线 1:485
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
Pintf_8x16(0,0,16,10);//(
Pintf_8x16(0,0,90,11);//)
Pintf_12x16(0,0,36,3);//速
Pintf_12x16(0,0,49,4);//度
Pintf_12x16(0,0,62,0);//:
Pintf_8x16(0,0,75,speed%10);//
}
void Display_Menu_2(void)
{ uchar i;
//type_num=Type_num_;
if(Key2_down){++type_num;Key2_down=0;}
if(Key3_down){--type_num;Key3_down=0;}
if(type_num>5)type_num=1;
if(type_num<1)type_num=5;
if(Key1_down)
{Key1_down=0;
if((Type_Flag[type_num]&0x80)==0x80)Type_Flag[type_num] &= 0x7f;
else Type_Flag[type_num] |= 0x80;
}
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x8(0,2,114,10+(Tx_type_%2));//通信标志 0:无线 1:485
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
Pintf_8x16(0,2,8,10);//(
Pintf_8x16(0,2,16,type_num/10);//效果的序号
Pintf_8x16(0,2,24,type_num%10);
if((Type_Flag[type_num]&0x80)==0x80)Pintf_8x8(0,2,87,23);//√
else Pintf_8x8(0,2,87,24);
Pintf_8x16(0,2,98,11);//)
for(i=0;i<4;i++)
{Pintf_12x16(0,2,33+i*13,(type_num-1)*4+9+i); } //效果选择
Pintf_8x8(0,1,38,4);//key3 左箭头
Pintf_8x8(0,1,76,5);//key2 右箭头
Pintf_8x8(0,1,114,8);//OK 确认存储
}
void Display_Menu_3(void)
{
// speed=Speed_;
if(Key3_down){++speed;Key3_down=0;}
if(Key2_down){--speed;Key2_down=0;}
if(speed>9)speed=1;
if(speed<1)speed=9;
if(Key1_down){Key1_down=0;Speed_= speed;Sys_info[1]=speed;}
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x8(0,2,114,10+(Tx_type_%2));//通信标志 0:无线 1:485
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
Pintf_8x16(0,2,16,10);//(
Pintf_8x16(0,2,90,11);//)
Pintf_12x16(0,2,36,3);//速
Pintf_12x16(0,2,49,4);//度
Pintf_12x16(0,2,62,0);//:
Pintf_8x16(0,2,75,speed);//
Pintf_8x8(0,1,38,2);//上箭头
Pintf_8x8(0,1,76,3);//下箭头
Pintf_8x8(0,1,114,8);//OK
}
void Display_Menu_4(void)
{ uchar i;
//tx_type=Tx_type_;
if(Key2_down)
{ Key2_down=0; tx_type++;}
if(Key1_down){Key1_down=0;Tx_type_= tx_type%2;Sys_info[2]=tx_type%2;}
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
for(i=0;i<4;i++)
{ Pintf_12x16(0,2,i*13,5+i); } //通信方式
Pintf_8x16(0,2,52,10);//(
Pintf_8x16(0,2,114,11);//)
if(tx_type%2)
{ for(i=0;i<4;i++)
{Pintf_12x16(0,2,60+i*12,29+i); //无线传输
}
}
else{Pintf_8x16(0,2,60,4);//4
Pintf_8x16(0,2,68,8);//8
Pintf_8x16(0,2,76,5);//5
Pintf_12x16(0,2,84,31);//传
Pintf_12x16(0,2,96,32);//输
}
Pintf_8x8(0,1,76,21);//上下箭头
Pintf_8x8(0,1,114,8);//OK
}
void Display_Menu_5(void)
{uchar i;
if(Key3_down){++Floor_High;Key3_down=0;}
if(Key2_down){--Floor_High;Key2_down=0;}
if(Floor_High>30)Floor_High=1;
if(Floor_High<1)Floor_High=30;
if(Key1_down){Key1_down=0;FLOOR_HIGH_ = Floor_High;Sys_info[3]=Floor_High;}
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x8(0,2,114,10+Tx_type_);//通信标志 0:无线 1:485
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
Pintf_8x16(0,2,8,10);//(
Pintf_8x16(0,2,105,11);//)
for(i=0;i<5;i++){ Pintf_12x16(0,2,16+i*12,33+i);}//楼层数设置
Pintf_12x16(0,2,76,0);//:
Pintf_8x16(0,2,89,Floor_High/10);//十位
Pintf_8x16(0,2,97,Floor_High%10);//个位
Pintf_8x8(0,1,38,2);//上箭头
Pintf_8x8(0,1,76,3);//下箭头
Pintf_8x8(0,1,114,8);//OK
}
void Display_Menu_6(void)
{
if(Key3_down){++times;Key3_down=0;}
if(Key2_down){--times;Key2_down=0;}
if(times>60)times=1;if(times<1)times=60;
if(Key1_down){Key1_down=0;Times_= times;Sys_info[4]= times;}
if(Cls_stype){cls();Cls_stype=0;}
Pintf_8x8(0,2,114,10+Tx_type_);//通信标志 0:无线 1:485
Pintf_8x8(0,1,0,14+OK_key);//菜单标志
Pintf_8x16(0,2,16,10);//(
Pintf_8x16(0,2,96,11);//)
Pintf_12x16(0,2,28,38);//间
Pintf_12x16(0,2,41,39);//隔
Pintf_12x16(0,2,54,0);//:
Pintf_8x16(0,2,67,times/10);//
Pintf_8x16(0,2,75,times%10);//
Pintf_12x16(0,2,83,40);//秒
Pintf_8x8(0,1,38,2);//上箭头
Pintf_8x8(0,1,76,3);//下箭头
Pintf_8x8(0,1,114,8);//OK
}
/*************************************************************************************
固有效果
**************************************************************************************/
void Display_Mode_1(void)//单色往上跑
{ uchar Color,i;
for(Color=0;Color<7;Color++)
for(i=0;i<FLOOR_HIGH_;i++)
{nF905_Send_buf[0]=((color[Color]>>0)&0x01)*255;
nF905_Send_buf[1]=((color[Color]>>1)&0x01)*255;
nF905_Send_buf[1]=((color[Color]>>2)&0x01)*255;
Send_905(i,nF905_Send_buf);
delay_1ms(Speed_*120);
}
// delay_1ms(Times_*1000);
}
void Display_Mode_2(void)
{;}
void Display_(void)
{uchar i,j;
for(i=1;i<6;i++)
{if((Type_Flag[i]&0x80)==0x80)
if(Tx_type_) //
{
switch(i)
{ case 5: Sys_info[0]=i;break;
case 1: Sys_info[0]=i;break;
case 2: Sys_info[0]=i;break;
case 3: Sys_info[0]=i;break;
case 4: Sys_info[0]=i;break;
default: break;
}
nF905_Send_buf[0]=(color[i]&0x01)*255;nF905_Send_buf[1]=((color[i]>>1)&0x01)*255;nF905_Send_buf[2]=((color[i]>>2)&0x01)*255;
for(j=0;j<FLOOR_HIGH_;j++)
{ Send_905(j+1,nF905_Send_buf);//delay_60ms((Times_*1000)/50);//delay2(50);
}
delay_60ms((Times_*1000)/50);
}
else
{
for(j=0;j<5;j++)
{
Sys_info[0]=i;
send_addr(0x01);
sndchar(0xaa);
sndchar((color[i]&0x01)*255);
sndchar(((color[i]>>1)&0x01)*255);
sndchar(((color[i]>>2)&0x01)*255);
sndchar(0);
delay_60ms((Times_*1000)/50);
/* if(Received_Flag)
{ Received_Flag=0;
Pintf_8x16(0,0,76,temp[1]/100);
Pintf_8x16(0,0,84,temp[1]%100/10);
Pintf_8x16(0,0,92,temp[1]%10);
Pintf_8x16(0,0,100,(temp[2]&0xf0)>>4);
Pintf_8x16(0,0,108,(temp[2]&0x0f));
temp[2]=0;temp[1]=0;
break;
}*/
if(Send_ok==1){Send_ok=0;break;}
}
Send_ok=0;
}
}
}
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WAIT_TIME;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
/* 写一个扇区-------写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
void write_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
uint i = 0;
uint sector_addr = 0;
/* 擦除 要修改/写入 的扇区 */
sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
ISP_ADDRH = (uchar)(sector_addr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
for(i = 0; i< counter; i++)
{
/* 写一个字节 */
ISP_ADDRH = (uchar)(begin_addr >> 8);
ISP_ADDRL = (uchar)(begin_addr & 0x00ff);
ISP_DATA = array[i];
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
begin_addr++;
}
ISP_IAP_disable();
}
/* 读一个扇区-------从Flash中读出数据, 只在同一个扇区内读,------------------------*/
/* begin_addr,被读数据Flash开始地址;counter,连续读多少个字节; array[],数据存放 */
void read_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
uint i = 0;
ISP_IAP_enable();
for(i = 0; i< counter; i++)
{
/* 读一个字节 */
ISP_ADDRH = (uchar)(begin_addr >> 8);
ISP_ADDRL = (uchar)(begin_addr & 0x00ff);
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
array[i] = ISP_DATA;
_nop_();
begin_addr++;
}
ISP_IAP_disable();
}
/*****************************************************
初始化串口
*******************************************************/
void SYS_Init (void)
{
TH1=0xf3;//4800Bit 12MHZ
TL1=0xf3;
//TMOD T/C1-----GATE C/T M1 M0 T/C0-- GATE C/T M1 M0
TMOD=0x02;
// TH0=156;
// TL0=156; //100 US来一次中断
TMOD=0x20;//M0=0;M1=1;//自动从载八位定时器
//IE EA D6 ET2 ES ET1 EX1 ET0 EX0
EX0=1;
EX1=1;
ES=1;
// ET0=1;
ET1=0;
//SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0=1;
SM1=1;
SM2=1;
REN=1;
TB8=1;
//PCON SMOD D6 D5 D4 GF1 GF0 PD IDL
PCON=0x80;//加倍
//TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
IT0=1;//下降沿触发
//IT1=1;
//IP 中断优先级控制
IP=0x04;//D7 D6 PT2 PS PT1 PX1 PT0 PX0
TR1=1;
TR0=1;
EA=1;
DE=0;
P3=0xff;
Key1=0;
Key2=0;
Key3=0;
OK_key=0;
Received_Flag=0;
}
void getchar(void)
{uint data cout;
// unsigned long int cout;
DE=0;
riflag=0;
for(cout=0;cout<15000;cout++)
{if(RI==1)
{riflag=1;
RI=0;
break;
}
}
}
void sndchar(uchar dats)//reentrant
{uint cout;
EA=0;
DE=1;
SBUF=dats;
for(cout=0;cout<15000;cout++)
{if(TI==1)
{TI=0;break;}
}
DE=0;
EA=1;
}
//////////////////////////////////////////
void send_addr(uchar addr)//reentrant
{uint count;
EA=0;
DE=1;
TB8=1;
SBUF=addr;//addr=0x55表示命令,让所有从机启动扫灯程序
for(count=0;count<15000;count++)
{if(TI==1)
{TI=0; break;}
}
DE=0;
TB8=0;
EA=1;
}
/*****************************************************
串口中断
*******************************************************/
void serialint(void) interrupt 4 using 3
{uchar idata ir;
// uchar temp[6];
EA=0;
if(RI)
{getchar();
if(riflag==0)
{SM2=1; EA=1;return;}//Asck(Error);
temp[0]=SBUF;
if(temp[0]!=0x00)//地址
{SM2=1; EA=1;return; }//Asck(Error);
SM2=0;
for(ir=0;ir<2;ir++)
{getchar();
if(riflag==0)
{SM2=1;EA=1; return;}//Asck(Error);
temp[ir+1]=SBUF;
}
if(temp[1]==0xaa)//同步码
{if(temp[2]==0x66){Send_ok=1;}
else{ Send_ok=0;}
}
//Received_Flag=1;
EA=1;
}
EA=1;
}
void Read_nF905(void) interrupt 0 using 1
{
EA=0;
if(AM)
{
TRX_CE=0;
TX_EN =0;
delay2(4);
SPI_read_some(0x24,Received_buf+18,4);
while(AM);
Received_Flag=1;
TRX_CE=1;
if(Received_buf[18+1]==0x66){Send905_ok=1;Received_buf[18+1]=0;}
else {Send905_ok=0;Received_buf[18+1]=0;}
}
EA=1;
}
void KEY_INT() interrupt 2 using 2
{ EA=0;
// P3_3=1;
delay2(300);
while(!P3_3);
OK_key++;
if(OK_key>=6)OK_key=0;
Cls_stype=1;
Key3=0;Key2=0;Key1=0;
type_num=Type_num_;
speed=Sys_info[1]; tx_type=Sys_info[2];Floor_High = Sys_info[3];times=Sys_info[4];
Speed_=Sys_info[1];Tx_type_=Sys_info[2];FLOOR_HIGH_=Sys_info[3];Times_=Sys_info[4];
EA=1;
}
///////////////////////////////////////////////////////
void Key_service(void)
{//uchar i;
if(OK_key>0)
{
KEY_3=1;
if(KEY_3==0){delay2(2);while(!KEY_3);Key3_down=1;Key3++;}
KEY_2=1;
if(KEY_2==0){delay2(2);while(!KEY_2);Key2_down=1;Key2++;}
KEY_1=1;
if(KEY_1==0){delay2(2);while(!KEY_1);Key1_down=1;Key1++;}
}
}
//////////////////////////////////////////
void Send_905(uchar addr,uchar *BUF)
{ EA=0;
// InitnRF905();
TRX_CE=0;
TX_EN=0;
SPI_write_some(0x20, BUF,4);
SPI_addrs(addr);
TRX_CE=1;
TX_EN=1;
// delay2(5);
while(DR);
TX_EN=0;
// InitnRF905();
EA=1;
}
/*****************************************************
主程序
*******************************************************/
main()
{
uint aa=0;
SYS_Init();
EA=0;
InitnRF905();
LCD_Init();
cls();
Display_Flash();
read_flash_in_one_sector(0x8200,10,Type_Flag);
read_flash_in_one_sector(0x8100,10,Sys_info );
speed=Sys_info[1]; tx_type=Sys_info[2];Floor_High = Sys_info[3];times=Sys_info[4];
Speed_=Sys_info[1];Tx_type_=Sys_info[2];FLOOR_HIGH_=Sys_info[3];Times_=Sys_info[4];
EA=1;
Key1=0;Key2=0;Key3=0;
while(1)
{// InitnRF905();
//Display_image(&LOG[0],0,0,122,32) ;
if(OK_key==0)
{ Display_Menu_1(); Display_();}
if(OK_key==1)
Display_Menu_2();
if(OK_key==2)
Display_Menu_3();
if(OK_key==3)
Display_Menu_4();
if(OK_key==4)
Display_Menu_5();
if(OK_key==5)
Display_Menu_6();
write_flash_in_one_sector(0x8100, 10, Sys_info);
write_flash_in_one_sector(0x8200, 10, Type_Flag);
//if(Received_Flag){ Received_Flag=0;
/*
TRX_CE=0;
TX_EN=0;
SPI_read_some(0x10,Received_buf,10);
SPI_read_some(0x23,Received_buf+10,4);
SPI_read_some(0x21,Received_buf+14,4);
TRX_CE=1;
TX_EN=0;
for(i=0;i<22;i++)
{sndchar(Received_buf[i]);
Received_buf[i]=0;}
*/
//delay2(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -