欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC32G12K128屠龍刀+FT24C256A+MAX7219
[打印本頁]
作者:
wuzhengmin
時間:
2025-11-11 21:43
標題:
STC32G12K128屠龍刀+FT24C256A+MAX7219
最近開始折騰STC32G12K128
買了塊屠龍刀回來,手頭有IIC的存儲芯片FT24C256A
今天我們目的是使用STC的USB-CDC功能,在存儲芯片上寫入8個數值后讀取出來,在數碼管上顯示,同時
要打印到PC機的串口(不用普通串口,用STC-USB-CDC串口)
先看器件:
作者:
wuzhengmin
時間:
2025-11-11 21:47
先看主程序:
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用戶文件頭說明信息
// 文件名稱: main.c
// 文件描述:
// 文件版本: V1.0
// 修改記錄:
// 1. (2025-11-06) 創建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默認已包含stdio.h、intrins.h等頭文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用戶頭文件包含
#include "i2c.h"
#include "MAX7219.h"
// 8位Max7219數碼管模塊顯示, CLK = P6^4;CS = P6^5; DIN = P6^6;
//選擇I2C數據口: SCL(P2.5), SDA(P2.4),IIC分頻系數n=60
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用戶全局變量定義、用戶宏定義以及函數聲明
void PlaySMG(u8 tmp_1[8]);
char code LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全滅*/
,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff}; /*A,B,C,D,E,F,P,U,全亮*/
char code table[]={
0x7e, //0
0x18, //1
0x37, //2
0x3d, //3
0x59, //4
0x6d, //5
0x6f, //6
0x38, //7
0x7f, //8
0x7d, //9
0x7b, //A
0x4F, //b
0x66, //C
0x1F, //d
0x67, //E
0x63, //F
}; //共陰
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 項目主函數
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用戶主函數初始化代碼
u8 i=0;
u8 tmp[8];
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函數中運行一次的用戶代碼
Initial(); //MAX7219初始化
P40 = 0; //三極管引腳輸出低電平
P60 = 0; //輸出低電平 //這2顆燈亮了
P61 = 0; //輸出低電平 //說明這段程序是執行了
delay_ms(2000);//經STC論壇版主erci***指導“print_usb并非阻
//塞函數,所以在打開串口前可能已經打印完成了。 所以延時應放在打印前,或者在循環里
//每隔1s反復打印這樣每次打開串口都能看到。”
// printf_usb( " A 首先從24C02讀取8個數\xfd: \r\n");
// printf_usb( " B 把從24C02讀取8個數\xfd加1后寫入24C02:\r\n");
// printf_usb( " C 把從24C02讀取8個數\xfd減1后寫入24C02:\r\n");
// printf_usb( " D 把24C02地址0x0000的8個數\xfd清零: \r\n");
//printf_usb( " 發字符給printf_usb,引發bUsbInBusy檢測 \r\n");
//可以先printf再while(bUsbInBusy == 1);,但是這樣依然看不到第一條printf的
//while(bUsbInBusy==1) //cdc串口發數據之前可以判斷一下當前的usb狀態,等他空閑了再發,
//實測這樣一點問題沒有,但是我們這里不行啊
//{
printf_usb( " A 首先從24C256讀取8個數: \r\n");
printf_usb( " B 把從24C256讀取8個數加1后寫入24C256:\r\n");
printf_usb( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
printf_usb( " D 把24C256地址0x0000k開始的8個數清零: \r\n");
//};
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
printf_usb( "%u\t ",tmp[i] );
} //為什么串口助手看不到以上打印結果?
//可能是USB查詢方式,只有在回答查詢的時候才輸出?
PlaySMG(tmp); //數碼管打印8個字節
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
// USBLIB_OUT_Done(); //查詢方式處理USB接收的數據
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函數中用戶主循環代碼
if( bUsbOutReady )
{
//USB_SendData(UsbOutBuffer,OutNumber);
switch( UsbOutBuffer[0] )
{
case 'A': //
//printf("從24C02讀出8個數\xfd據: \r\n");
printf("從24C256讀出8個數據: \r\n");
//-----------------------讀取數據-----------------------
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
printf( "%u\t",tmp[i] );
/* 以十進制打印
"%u\t" 是格式化字符串,其中:%u 是一個格式控制符,用于指定輸出一個無符號整數。
\t 是一個轉義字符,表示輸出一個水平制表符。dat[i] 是要輸出的數據,它應該是一個無符號整數類型的數組元素。
%u格式控制符用于將數字轉換為無符號整數格式。無符號整數是指不帶符號的整數,即只能表示零和正數的整數類型
*/
}
printf( "讀取結束\r\n");
PlaySMG(tmp); //數碼管打印8個字節
delay_ms(200);
break;
case 'B':
printf( " B 把從24C256讀取8個數加1后寫入24C02:\r\n");
//-----------------------寫入修改后的數據-----------------------
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
tmp[i] = (tmp[i] +1);
}
IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都加1后,原位置寫回去
delay_ms(200);
printf("加1后存儲完成再從24C256讀出8個數據: \r\n");
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
printf( "%u\t",tmp[i] );
}
PlaySMG(tmp); //數碼管打印8個字節
delay_ms(200);
printf("請比較差別,證實加1寫入成功\r\n");
break;
case 'C':
printf( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
tmp[i] = (tmp[i] -1);
}
IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都減1后,原位置寫回去
delay_ms(200);
printf("減1后存儲完成再從24C256讀出8個數據: \r\n");
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
printf( "%u\t",tmp[i] );
}
delay_ms(200);
printf("請再次比較差別,證實減1寫入成功\r\n");
PlaySMG(tmp); //數碼管打印8個字節
break;
case 'D':
printf( " D 把24C256地址0x0000開始的8個數清零::\r\n");
for( i=0;i<8;i++ )
{
tmp[i] = 0x00;
}
IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,數組成員都變0后,原位置寫回去
delay_ms(200);
printf( " D 24C256地址0x0000開始的8個數已經變成::\r\n");
IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
for( i=0;i<8;i++ )
{
printf( "%u\t",tmp[i] );
}
delay_ms(200);
printf("請再次比較差別,證實清零成功\r\n");
PlaySMG(tmp); //數碼管打印8個字節
break;
default:
break;
}
usb_OUT_done();
}
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
////////////////////////////////////////
// 系統初始化函數
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能訪問擴展XFR
AccessCodeFastest(); //設置最快速度訪問程序代碼
AccessIXramFastest(); //設置最快速度訪問內部XDATA
IAP_SetTimeBase(); //設置IAP等待參數,產生1us時基
//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用戶預初始化代碼
//<<AICUBE_USER_PREINITIAL_CODE_END>>
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口為準雙向口模式
P1M0 = 0x00; P1M1 = 0x00; //初始化P1口為準雙向口模式
P2M0 = 0x00; P2M1 = 0x00; //初始化P2口為準雙向口模式
P3M0 = 0x00; P3M1 = 0x00; //初始化P3口為準雙向口模式
P4M0 = 0x00; P4M1 = 0x00; //初始化P4口為準雙向口模式
P5M0 = 0x00; P5M1 = 0x00; //初始化P5口為準雙向口模式
P6M0 = 0x00; P6M1 = 0x00; //初始化P6口為準雙向口模式
P7M0 = 0x00; P7M1 = 0x00; //初始化P7口為準雙向口模式
I2C_Init(); //I2C初始化
delay_ms(1);
USBLIB_Init(); //USB庫初始化
delay_ms(1);
//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用戶初始化代碼
//<<AICUBE_USER_INITIAL_CODE_END>>
EnableGlobalInt(); //使能全局中斷
USBLIB_WaitConfiged(); //等待USB完成配置
}
////////////////////////////////////////
// 微秒延時函數
// 入口參數: us (設置延時的微秒值)
// 函數返回: 無
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6
} while (--us);
}
////////////////////////////////////////
// 毫秒延時函數
// 入口參數: ms (設置延時的毫秒值)
// 函數返回: 無
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用戶函數實現代碼
////////////////////////////////////////
// MAX7219顯示函數
// 入口參數: tmp_1[8]數組 (要顯示的8個數的數組)
// 函數返回: 無
////////////////////////////////////////
void PlaySMG(u8 tmp_1[8])
{
Write7219(8,tmp_1[0]); //數碼管左邊第1位,如果給15就是熄滅
Write7219(7,tmp_1[1]); //數碼管左邊第2位
Write7219(6,tmp_1[2]); //數碼管左邊第3位
Write7219(5,tmp_1[3]); //數碼管左邊第4位
Write7219(4,tmp_1[4]); //數碼管左邊第5位,如果給15就是熄滅
Write7219(3,tmp_1[5]); //數碼管左邊第6位
Write7219(2,tmp_1[6]); //數碼管左邊第7位
Write7219(1,tmp_1[7]); //數碼管左邊第8位 99--3 100--4 101--5 102--6 103--7 104--8 105--9
//Write7219(1,LEDcode[14]|0x80); //數碼管左邊第8位 106--"-" 107--E 108--H 109--L 91--E 92--H
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
復制代碼
作者:
wuzhengmin
時間:
2025-11-11 21:48
接著看IIC.C
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用戶文件頭說明信息
// 文件名稱: i2c.c
// 文件描述:
// 文件版本: V1.0
// 修改記錄:
// 1. (2025-11-06) 創建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h"
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用戶頭文件包含
#include "i2c.h"
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用戶全局變量定義、用戶宏定義以及函數聲明
bit zjyd_ASK; //zjyd_ASK=0 就是ASK zjyd_ASK=1 就是NASK
u8 dat;
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// I2C初始化函數
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void I2C_Init(void)
{
I2C_SwitchP2425(); //選擇I2C數據口: SCL(P2.5), SDA(P2.4)
I2C_MasterMode(); //設置I2C為主機模式
I2C_SetClockDivider(60); //設置I2C為主機模式時鐘
I2C_Enable(); //使能I2C功能
//<<AICUBE_USER_I2C_INITIAL_BEGIN>>
// 在此添加用戶初始化代碼
//<<AICUBE_USER_I2C_INITIAL_END>>
}
////////////////////////////////////////
// 主機模式等待命令完成
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void I2C_MasterWait(void)
{
while (!I2C_CheckMasterFlag()); //等待完成標志
I2C_ClearMasterFlag(); //清除完成標志
I2C_Idle(); //恢復IDLE狀態
}
////////////////////////////////////////
// 主機模式發送起始信號
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void I2C_MasterStart(void)
{
I2C_Start(); //觸發主機模式起始命令
I2C_MasterWait(); //等待命令完成
}
////////////////////////////////////////
// 主機模式發送停止信號
// 入口參數: 無
// 函數返回: 無
////////////////////////////////////////
void I2C_MasterStop(void)
{
I2C_Stop(); //觸發主機模式停止命令
I2C_MasterWait(); //等待命令完成
}
////////////////////////////////////////
// 主機模式發送1字節數據
// 入口參數: dat (待發送的字節數據)
// 函數返回: 0 (接收的應答信號為ACK)
// 1 (接收的應答信號為NAK)
////////////////////////////////////////
BOOL I2C_MasterSendByte(uint8_t dat)
{
I2C_WriteData(dat); //將數據寫入I2C數據寄存器
I2C_SendData(); //觸發主機模式寫數據命令
I2C_MasterWait(); //等待命令完成
I2C_RecvACK(); //觸發主機模式接收應答命令
I2C_MasterWait(); //等待命令完成
return I2C_MasterReadACK(); //讀取并返回應答信號
}
////////////////////////////////////////
// 主機模式接收1字節數據
// 入口參數: ack (待發送的應答信號)
// 函數返回: (接收的字節數據)
////////////////////////////////////////
uint8_t I2C_MasterReadByte(BOOL ack)
{
uint8_t dat;
I2C_RecvData(); //觸發主機模式讀數據命令
I2C_MasterWait(); //等待命令完成
dat = I2C_ReadData(); //讀取接收的數據
if (!ack)
I2C_MasterSetACK(); //將ACK數據寫入寄存器
else
I2C_MasterSetNAK(); //將NAK數據寫入寄存器
I2C_SendACK(); //觸發主機模式發送應答命令
I2C_MasterWait(); //等待命令完成
return dat; //返回接收的數據
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用戶函數實現代碼
//存儲地址超過2K的,要用16位地址
////////////////////////////////////////
// 主機模式向IIC_24c256寫入1字節數據
// 入口參數: addrH(地址高8位),addrL(地址低8位),dat (待發送的1字節數據)
// 函數返回:無
//
////////////////////////////////////////
void IIC_Write1Gbyte(u8 addrH,u8 addrL, u8 dat) //寫入一個字節
{
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAW); //發送從設備地址+寫
if(!zjyd_ASK) // 收到ASK就發送AT24C256地址高8位
{
zjyd_ASK = I2C_MasterSendByte(addrH); //寫存儲地址高8位
if(!zjyd_ASK) // 收到ASK就發送AT24C256地址低8位
{
zjyd_ASK = I2C_MasterSendByte(addrL); //寫存儲地址低8位
if(!zjyd_ASK) // 收到ASK就向AT24C256寫1字節數據
{
zjyd_ASK = I2C_MasterSendByte(dat); //寫1字節數據
}
if(zjyd_ASK) //應答是NASK,就中止
return;
I2C_MasterStop(); //發送停止命令
}
}
}
////////////////////////////////////////
// 主機模式讀取1字節數據
// 入口參數: addrH(地址高8位),addrL(地址低8位),ack (待發送的應答信號)
// 函數返回: (接收的字節數據)
////////////////////////////////////////
void I2C_MasterRead1GByte(u8 addrH,u8 addrL)
{
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAW); //發送從設備地址+寫
if(!zjyd_ASK) // 收到ASK就發送AT24C256地址高8位
{
zjyd_ASK = I2C_MasterSendByte(addrH); //寫存儲地址高8位
if(!zjyd_ASK) // 收到ASK就發送AT24C256地址低8位
{
zjyd_ASK = I2C_MasterSendByte(addrL); //寫存儲地址低8位
if(zjyd_ASK) //應答是NASK,就中止
return ;
else
{
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAW); //發送從設備地址+讀
if(!zjyd_ASK) // 收到ASK就向AT24C256讀1字節數據
{
dat = I2C_MasterReadByte(zjyd_ASK); //就讀1個字節,入口參數是非應答
I2C_MasterStop(); //發送停止命令
}
}
}
}
}
//--------------------------------功能函數--------------------------------
// (器件24C256的應答ASK或者NASK)
//存儲地址超過2K的,要用16位地址,連續讀取iic幾個字節的函數
void IIC_Write_NByte(u8 addrH,u8 addrL, u8 *p, u8 number) /* WordAddress,1st Data Address,2nd Data
Address,Byte lenth 在芯片addrH+addrL開始的地址里寫入p的內容,長度是number個字節,F0=0,right, F0=1,error */
{ //
// 1. 發送起始信號+設備地址(寫模式)
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAW); //主機模式發送1字節數據,函數返回: 接收的應答信號0為ACK),1為NAK
// 設備地址 + 寫命令(最后一位是0)
if(!zjyd_ASK) // 2. 收到ASK就發送AT24C02地址
{
zjyd_ASK = I2C_MasterSendByte(addrH); //寫存儲器地址高8位
if(!zjyd_ASK) // 收到ASK就發送AT24C256地址低8位
{
zjyd_ASK = I2C_MasterSendByte(addrL); //寫存儲地址低8位
if(zjyd_ASK) //應答是NASK,就中止
return;
else
{
do //開始連續寫number個字節
{
zjyd_ASK = I2C_MasterSendByte(*p); //寫入數組p的內容去IIC
p++; //指針+1,主機模式寫1字節數據,函數返回0為ACK, 1為NAK
if(zjyd_ASK) break; //出錯了就終止
}
while(--number);
I2C_MasterStop(); //發送停止命令,結束IIC通信
}
}
}
}
//連續讀取iic幾個字節的函數
void IIC_Read_NGByte(u8 addrH, u8 addrL, u8 *p, u8 number) //WordAddress,1st Data Address,2nd Data Address,Byte lenth
{
// 1. 發送起始信號+設備地址(寫模式)
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAW); //主機模式發送1字節,函數返回: 0(應答信號為ACK), 1(接收的應答信號為NAK)
// 設備地址 + 寫命令(最后一位是0)
if(!zjyd_ASK) // 2. 收到ASK就發送AT24C256高位地址
zjyd_ASK = I2C_MasterSendByte(addrH); //發送存儲芯片AT24C256高位地址
if(!zjyd_ASK) // 3. 還能收到ASK就發送低位地址
zjyd_ASK = I2C_MasterSendByte(addrL); //發送存儲芯片AT24C256低位地址
if(!zjyd_ASK) // 3. 還能收到ASK就發送起始信號
{
I2C_MasterStart(); // START
zjyd_ASK = I2C_MasterSendByte(SLAR); //發送設備地址+讀命令
}
if(!zjyd_ASK) //4. 還能收到ASK連續讀取number字節(最后1字節發送NACK)
{
do
{
*p = I2C_MasterReadByte(zjyd_ASK); //主機模式接收1字節數據,入口參數: ack (待發送的應答信號)函數返回: (接收的字節數據)
//讀取1字節數據函數
p++; //指針+1
if(number!= 1)
zjyd_ASK=0; //發送ASK函數
else
zjyd_ASK=1; //發送NASK函數
}while(--number);
I2C_MasterStop();
}
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
復制代碼
作者:
wuzhengmin
時間:
2025-11-11 21:50
接著是IIC.h
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用戶文件頭說明信息
// 文件名稱: i2c.h
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#ifndef __I2C_H__
#define __I2C_H__
//<<AICUBE_USER_DEFINE_BEGIN>>
// 在此添加用戶宏定義
#define SLAW 0xA0 // IIC地址+寫 1010 0000 0xA0 (A2=0,A1=0,A0=0)
#define SLAR 0xA1 // IIC地址+讀 1010 0001 0xA1 (A2=0,A1=0,A0=0)
//<<AICUBE_USER_DEFINE_END>>
void I2C_Init(void);
void I2C_MasterWait(void);
void I2C_MasterStart(void);
void I2C_MasterStop(void);
BOOL I2C_MasterSendByte(uint8_t dat);
uint8_t I2C_MasterReadByte(BOOL ack);
//<<AICUBE_USER_EXTERNAL_DECLARE_BEGIN>>
// 在此添加用戶外部函數和外部變量聲明
extern u8 dat;
void IIC_Write1Gbyte(u8 addrH,u8 addrL, u8 dat); //寫入一個字節
void I2C_MasterRead1GByte(u8 addrH,u8 addrL);
void IIC_Write_NByte(u8 addrH,u8 addrL, u8 *p, u8 number); /* WordAddress,1st Data Address,2nd Data
Address,Byte lenth 在芯片addrH+addrL開始的地址里寫入p的內容,長度是number個字節,F0=0,right, F0=1,error */
void IIC_Read_NGByte(u8 addrH, u8 addrL, u8 *p, u8 number); //WordAddress,1st Data Address,2nd Data Address,Byte lenth
//<<AICUBE_USER_EXTERNAL_DECLARE_END>>
#endif
復制代碼
作者:
wuzhengmin
時間:
2025-11-11 21:51
再看MAX7219.c
#include "MAX7219.h"
#include "config.h"
//地址、數據發送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
CS=0; //拉低片選線,選中器件
//發送地址
for (i=0;i<8;i++) //移位循環8次
{
CLK=0; //清零時鐘總線
DIN=(bit)(address&0x80); //每次取高字節
address<<=1; //左移一位
CLK=1; //時鐘上升沿,發送地址
}
//發送數據
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1; //時鐘上升沿,發送數據
}
CS=1; //發送結束,上升沿鎖存數據
}
//MAX7219初始化,設置MAX7219內部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00); //選擇工作模式(0xX0)
Write7219(DECODE_MODE,0xff); //選用全譯碼模式
Write7219(SCAN_LIMIT,0x07); //8只LED全用
Write7219(INTENSITY,0x02); //設置初始亮度,共有16級可選擇,用于設置SMG的顯示亮度,從0x00~0x0F
}
復制代碼
作者:
wuzhengmin
時間:
2025-11-11 21:52
接著是MAX7219.h
#ifndef __MAX7219_H__
#define __MAX7219_H__
#include <STC32G.h>
sbit CLK = P6^4; //MAX7219串行時鐘CLK
sbit CS = P6^5; //MAX7219片選CS
sbit DIN = P6^6; //MAX7219串行數據DIN
#define DECODE_MODE 0x09 //譯碼控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器,有16級可選擇,用于設置LED的顯示亮度,從0xX0~0xXF
#define SCAN_LIMIT 0x0B //掃描界限寄存器
#define SHUT_DOWN 0x0C //關斷模式寄存器
#define DISPLAY_TEST 0x0F //測試控制寄存器
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);
#endif
復制代碼
作者:
wuzhengmin
時間:
2025-11-11 21:56
器件很簡單:
STC32G12K128 屠龍刀1塊,MAX7219 8位數碼管1個 AT24C256 IIC 存儲芯片一塊
編譯環境 :256
μVision V5.14.2
CKeil_v5\C251BIN C251.exe V5.60.0.0
A251.exe V4.69.13.0
L251.exe V4.66.93.0LIB251.exe OH251.exe S251.DLL DCORE51.DLL V4.30.1.0V1.47.0.0
V3.129.0.0
V2.81.6.0
作者:
wuzhengmin
時間:
2025-11-11 22:00
最后我把程序打包,壓縮發上來:
STC32G IIC256 MAX7219.zip
2025-11-11 22:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
426.48 KB, 下載次數: 0, 下載積分: 黑幣 -5
作者:
wuzhengmin
時間:
2025-11-11 22:01
歡迎大家多交流
作者:
joyb
時間:
2025-11-13 08:27
c251如何安裝?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1