标题:
LPC2124通过GPIO直接控制8个LED产生流水灯效果proteus仿真与源码
[打印本页]
作者:
Kenaaa
时间:
2018-5-2 15:34
标题:
LPC2124通过GPIO直接控制8个LED产生流水灯效果proteus仿真与源码
LPC2124流水灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(21.62 KB, 下载次数: 61)
下载附件
2018-5-2 18:22 上传
0.png
(49.7 KB, 下载次数: 50)
下载附件
2018-5-2 18:21 上传
LPC2124单片机源程序如下:
/****************************************************************************
* 文 件 名:main.c
* 功 能:LED显示控制。
* 通过GPIO直接控制8个LED产生流水灯效果
* 说 明:
* 这个警告可忽略,C2892E: signed constant overflow
****************************************************************************/
#include "config.h"
#include "math.h"
//LCD显示屏端口定义
#define LCD_SCL 1<<19
#define LCD_SI 1<<20
#define LCD_A0 1<<21
//TC77温度传感器
#define TC77_SCK 1<<16
#define TC77_CS 1<<17
#define TC77_SI 1<<18
//LCD1602液晶显示器
#define LCD1602_RS 1<<8
#define LCD1602_RW 1<<9
#define LCD1602_EN 1<<10
#define BUSY 1<<7
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<50000; i++);
}
}
//LCD初始化
void LCD_INIT()
{
IO0DIR = LCD1602_RS | LCD1602_RW | LCD1602_EN | 0xff;
}
//TC77初始化
void TC77_INIT()
{
IO1DIR = TC77_SCK | TC77_SI | TC77_CS | LCD_SCL | LCD_SI | LCD_A0;
}
//写命令
void WR_CMD(char cmd)
{
int i;
IO1CLR = LCD_A0;
for(i=7;i>=0;i--)
{
IO1CLR = LCD_SCL;
if(cmd & (1<<i))
{
IO1SET = LCD_SI;
}
else
{
IO1CLR = LCD_SI;
}
IO1SET = LCD_SCL;
}
}
//写数据
void WR_DAT(char dat)
{
int i;
IO1SET = LCD_A0;
for(i=7;i>=0;i--)
{
IO1CLR = LCD_SCL;
if(dat & (1<<i))
{
IO1SET = LCD_SI;
}
else
{
IO1CLR = LCD_SI;
}
IO1SET = LCD_SCL;
}
}
//LCD显示反转
void dis_reverse()
{
//WR_CMD(0xc8);
WR_CMD(0xa7);
//WR_CMD(0xa1);//0xc8是顺序颠倒,0xa7是指颜色颠倒
}
//LCD显示子程序1
void display1()
{
int i;
for(i=0;i<128;i++)
{
WR_DAT(i);
}
}
//LCD显示子程序2
void display2(int i)
{
WR_CMD(0xb0+i);//表示在第三页
WR_CMD(0x10);
WR_CMD(0x00);
WR_DAT(0xFF);
//WR_DAT(0x66);
//WR_DAT(0x66);
//WR_DAT(0xFF);
}
//LCD显示子程序3
void display3(int i)
{
int j;
WR_CMD(0xb0+i);//表示在第三页
for(j=0;j<8;j++)
{
WR_CMD(0x10+j);
WR_CMD(0x00);
WR_DAT(0xFF);
}
//WR_DAT(0x66);
//WR_DAT(0x66);
//WR_DAT(0xFF);
}
//LCD显示子程序4
void display4()
{
WR_CMD(0xb0+7);
WR_CMD(0x10);
WR_CMD(0x0F);
WR_DAT(0xFF);
WR_DAT(0x66);
WR_DAT(0x66);
WR_DAT(0xFF);
}
//LCD显示子程序5
void dis_logo()
{
int i;
int j;
const unsigned char table[][128] = {/* 共1024字节 */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x38,0x38,0x38,0x78,0x78,0x78,0x78,0x78,0x70,0xF0,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0x60,0x70,0x30,0x38,0x18,0x1C,0x0C,0x0E,0x06,0x06,0x07,0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x60,0x30,0x10,0x18,0x0C,0x06,0x06,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xFC,0xFC,0x7E,0x1E,0x1E,0x0E,0x06,0x07,0x07,0x07,0x0E,0xFE,0xFE,0xFE,0xFC,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x0F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFE,0xFC,0xF8,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0xE0,0xF8,0xF8,0xFC,0x8C,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x01,0x83,0x83,0x80,0x80,0x80,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0x80,0x00,0x80,0x80,0x00,0x00,0xC0,0xF0,0xF8,0xFC,0x1C,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7F,0xFF,0xFE,0xFE,0xFC,0xC0,0x80,0x80,0x80,0x80,0x80,0x81,0xC1,0xC1,0xF3,0xFF,0xFF,0xFF,0x7F,0x3F,0x1F,0x07,0xE0,0xFC,0xFF,0x7F,0x0F,0x03,0x01,0xC1,0xF1,0xFF,0xFF,0x1F,0xC7,0xF8,0xFC,0xFF,0x1F,0x1F,0x19,0x99,0x99,0x9F,0x1F,0x1F,0xC6,0xF0,0xFE,0xFF,0x1F,0x07,0x01,0x81,0xF1,0xFF,0xFF,0x3F,0x07,0xF0,0xFC,0xFF,0xFF,0x87,0x81,0x81,0xE1,0xFF,0xFF,0x7F,0x1F,0xC3,0xF0,0xFE,0xFF,0x1F,0xC7,0xF0,0xFE,0xFF,0x1F,0x07,0x00,0x80,0xF0,0xFC,0xFF,0x3F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x81,0x81,0xC0,0xC0,0xC0,0xC0,0xC0,0xC3,0xC3,0xC3,0xC3,0xC0,0xC0,0xC0,0xC2,0xC3,0xC3,0xC3,0xC0,0xC0,0x40,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,0x02,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x01,0x00,0x18,0x31,0x33,0x33,0x73,0x3B,0x3D,0x3F,0x1F,0x0F,0x03,0x00,0x02,0x03,0x03,0x03,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x03,0x01,0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFE,0xFE,0xFC,0xFC,0xF8,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xF8,0xF8,0xF8,0xFC,0xFC,0xFC,0xFC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x0F,0x0F,0x07,0x07,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x07,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x13,0x13,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
for(i=7;i>=0;i--)
{
WR_CMD(0xb0+i);//表示在第三页
WR_CMD(0x10);
WR_CMD(0x00);
for(j=127;j>=0;j--)
{
WR_DAT(table[i][j]);
}
}
/*for(i=0;i<8;i++)
{
WR_CMD(0xb0+i);//表示在第三页
WR_CMD(0x10);
WR_CMD(0x00);
for(j=0;j<128;j++)
{
WR_DAT(table[i][j]);
}
}*/
}
//LCD显示子程序6
void dis_CN()
{
int i;
int j;
int k;
const unsigned char table[5][2][16] = {
/*-- 文字: 李 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x84,0x44,0x44,0x24,0x14,0x0C,0xFF,0x0C,0x14,0x24,0x44,0x44,0x84,0x80,0x00,
0x08,0x08,0x08,0x08,0x09,0x49,0x89,0x79,0x0D,0x0B,0x09,0x08,0x08,0x08,0x08,0x00,
/*-- 文字: 金 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x80,0x40,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x20,0x40,0x80,0x80,0x00,
0x40,0x40,0x42,0x4A,0x72,0x42,0x42,0x7F,0x42,0x42,0x62,0x5A,0x42,0x40,0x40,0x00,
/*-- 文字: 文 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00,
0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,
/*-- 文字: 真 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x04,0x04,0xF4,0x54,0x54,0x54,0x5F,0x54,0x54,0x54,0xF4,0x04,0x04,0x00,0x00,
0x10,0x10,0x90,0x5F,0x35,0x15,0x15,0x15,0x15,0x15,0x35,0x5F,0x90,0x10,0x10,0x00,
/*-- 文字: 棒 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x44,0x54,0xD4,0x74,0x5F,0x54,0xD4,0x54,0x44,0x00,
0x04,0x03,0x00,0xFF,0x00,0x01,0x12,0x11,0x14,0x14,0xFF,0x14,0x14,0x11,0x12,0x00
};
for(i=0;i<2;i++)
{
WR_CMD(0xb0+i+3);
WR_CMD(0x10);
WR_CMD(0x00);
for(j=4;j>=0;j--)
{
for(k=15;k>=0;k--)
{
WR_DAT(table[j][i][k]);
}
}
}
}
//LCD显示子程序7
void dis_CN1()
{
int i;
int j;
const unsigned char table[2][64] = {
/*-- 文字: 李 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*0x80,0x84,0x44,0x44,0x24,0x14,0x0C,0xFF,0x0C,0x14,0x24,0x44,0x44,0x84,0x80,0x00,*/0x80,0x80,0x40,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x20,0x40,0x80,0x80,0x00,0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00,0x00,0x04,0x04,0xF4,0x54,0x54,0x54,0x5F,0x54,0x54,0x54,0xF4,0x04,0x04,0x00,0x00,0x10,0x10,0xD0,0xFF,0x90,0x10,0x44,0x54,0xD4,0x74,0x5F,0x54,0xD4,0x54,0x44,0x00,
/*0x08,0x08,0x08,0x08,0x09,0x49,0x89,0x79,0x0D,0x0B,0x09,0x08,0x08,0x08,0x08,0x00,*/0x40,0x40,0x42,0x4A,0x72,0x42,0x42,0x7F,0x42,0x42,0x62,0x5A,0x42,0x40,0x40,0x00,0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,0x10,0x10,0x90,0x5F,0x35,0x15,0x15,0x15,0x15,0x15,0x35,0x5F,0x90,0x10,0x10,0x00,0x04,0x03,0x00,0xFF,0x00,0x01,0x12,0x11,0x14,0x14,0xFF,0x14,0x14,0x11,0x12,0x00
/*-- 文字: 金 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 文 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 真 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 棒 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
};
for(i=1;i>=0;i--)
{
WR_CMD(0xb0+i+3);//表示在第三页
WR_CMD(0x10);
WR_CMD(0x00);
for(j=63;j>=0;j--)
{
WR_DAT(table[i][j]);
WR_DAT(table[i][j]);
}
}
}
//TC77温度传感器设置配置寄存器
void WR_CONF(int conf)
{
int i;
IO1SET = TC77_CS;
IO1CLR = TC77_CS;
IO1CLR = TC77_SCK;
for(i=15;i>=0;i--)
{
IO1SET = TC77_SCK;
if(conf & (1<<i))
{
IO1SET = TC77_SI;
}
else
{
IO1CLR = TC77_SI;
}
IO1CLR = TC77_SCK;
}
IO1SET = TC77_CS;
}
//读取TC77温度传感器的温度传感器
unsigned int RD_TEMP(void)
{
int i;
int temp = 0;
IO1SET = TC77_CS;
IO1CLR = TC77_CS;
IO1CLR = TC77_SCK;
for(i=15;i>=0;i--)
{
temp = temp<<1;
IO1SET = TC77_SCK;
if(TC77_SI)
{
temp++;
}
IO1CLR = TC77_SCK;
}
IO1SET = TC77_CS;
return temp;
}
//LCD1602液晶显示屏
/*******************************************************
* 功能:检查LCD是否忙碌,忙碌等待,不忙了返回
********************************************************/
void CheckBusy()
{
IO0DIR = 0x700;//0-7输入,8-10输出 ,读状态
while(1)
{
//读状态,RS=L,RW=H,E=H
IO0CLR = LCD1602_RS;
IO0SET = LCD1602_RW;
IO0SET = LCD1602_EN;
if(!(IO0PIN & BUSY)) //如果不忙了,返回
{
break;
}
IO0CLR = LCD1602_EN;//如果忙了,清空E标志,继续等待
}
IO0DIR = 0x7ff;//IO口全部恢复为输出
}
void LCD1602_WR_CMD(char cmd)
{
CheckBusy(); //检查是否BUSY ,忙碌一直在此等待
//写指令,RS=L,RW=L,然后D0~D7=指令码,E=高脉冲发送命令
IO0CLR = LCD1602_RS;
IO0CLR = LCD1602_RW;
IO0CLR = 0xff;//清空端口
IO0SET = cmd; //发送数据
IO0SET = LCD1602_EN;
DelayNS(10);
IO0CLR = LCD1602_EN;//恢复,以便继续使用
}
void LCD1602_WR_DAT(char dat)
{
CheckBusy(); //检查是否BUSY ,忙碌一直在此等待
//写指令,RS=H,RW=L,然后D0~D7=指令码,E=高脉冲发送命令
IO0SET = LCD1602_RS;
IO0CLR = LCD1602_RW;
IO0CLR = 0xff;//清空端口
IO0SET = dat; //发送数据
IO0SET = LCD1602_EN;
DelayNS(10);
IO0CLR = LCD1602_EN;//恢复,以便继续使用
}
void LCD1602_INIT()
{
LCD1602_WR_CMD(0x38);
LCD1602_WR_CMD(0x0f);
LCD1602_WR_CMD(0x01);
}
/*******************************************************
* 功能:设置显示位置
* 坐标自动加1
********************************************************/
void Set_XY(unsigned char x,unsigned char y)
{
switch(x)
{
case 0:
y+=0x80;
break;
case 1:
y+=0xc0;
break;
}
LCD1602_WR_CMD(y); //显示坐标更新 设置数据指针
}
/*******************************************************
* 功能:在指定位置显示单个字符
********************************************************/
void DisplayChar(unsigned char x,unsigned char y,unsigned char data)
{
Set_XY(x,y);
LCD1602_WR_DAT(data);
}
/*******************************************************
* 功能:在指定位置显示字符串
********************************************************/
void DisplayString(unsigned char x,unsigned char y,unsigned char *str)
{
Set_XY(x,y);
while(*str)
{
LCD1602_WR_DAT(*str);
str++;
}
}
/****************************************************************************
* 名 称:main()
* 功 能:根据表DISP_TAB来控制LED显示。
****************************************************************************/
int main(void)
{
unsigned char str1[]="TC77 Test ...";
unsigned char str2[]="T=";
int temp;
int tt;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
ARM_PROJECT_TC77.rar
(145.73 KB, 下载次数: 23)
2018-5-2 15:33 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1